我有一个 Pandas 数据框(超过 1k 行)。我的数据框中有数字、对象、字符串和布尔值。我想将数据帧的每个“单元格”转换为向量,并使用结果向量。然后,我计划比较每一行向量的相似性。
例如,我的数据是:
Col 0,Col 1,Col 2,Col 3,Col 4,Col 5,Col 6,Col 7,Col 8,Col 9,Col 10
12,65e1e35b7fe333,harry Joe,1,FALSE,swe,1,142.158.0.2,10.10.0.2,text1,0
13,65e1e35b7fe599,allen,1,FALSE,swe,1,142.158.0.20,10.10.0.20,text2,0
14,65e1e35b7fe165,carter,1,FALSE,swe,1,142.158.0.21,10.10.0.21,text3,0
我想最终得到一个如下所示的向量数据框:
Col 0,Col 1,Col 2,Col 3,Col 4,Col 5,Col 6,Col 7,Col 8,Col 9,Col 10
Vect1,Vect2,Vect3,Vect4,Vect5,Vect6,Vect7,Vect8,Vect9,Vect10,Vect11
Vect12,Vect 13,Vect 14,Vect4,Vect5,Vect6,Vect7,Vect 15,Vect 16,Vect 17,Vect11
Vect18,Vect 19,Vect 20,Vect4,Vect5,Vect6,Vect7,Vect 21,Vect 22,Vect 23,Vect11
有没有一个好的方法可以做到这一点也许在 Python w SciKit 中?
我尝试过:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
df=mydata
vectorizer = TfidfVectorizer()
# Transform the data to feature vectors
X = vectorizer.fit_transform(df)
X = pd.DataFrame(_X.todense(), index=df.index, columns=vectorizer.vocabulary_)
X.head()
# Labels
y = df['label']
What I got was:
TypeError Traceback (most recent call last)
Cell In[11], line 14
11 vectorizer = TfidfVectorizer()
13 # Transform the text data to feature vectors
---> 14 X = vectorizer.fit_transform(df)
16 X = pd.DataFrame(_X.todense(), index=df.index, columns=vectorizer.vocabulary_)
17 X.head()
File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:2079, in TfidfVectorizer.fit_transform(self, raw_documents, y)
2072 self._check_params()
2073 self._tfidf = TfidfTransformer(
2074 norm=self.norm,
2075 use_idf=self.use_idf,
2076 smooth_idf=self.smooth_idf,
2077 sublinear_tf=self.sublinear_tf,
2078 )
-> 2079 X = super().fit_transform(raw_documents)
2080 self._tfidf.fit(X)
2081 # X is already a transformed view of raw_documents so
2082 # we set copy to False
File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:1338, in CountVectorizer.fit_transform(self, raw_documents, y)
1330 warnings.warn(
1331 "Upper case characters found in"
1332 " vocabulary while 'lowercase'"
1333 " is True. These entries will not"
1334 " be matched with any documents"
1335 )
1336 break
-> 1338 vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary_)
1340 if self.binary:
1341 X.data.fill(1)
File /anaconda/envs/xxx_py38/lib/python3.9/site-packages/sklearn/feature_extraction/text.py:1207, in CountVectorizer._count_vocab(self, raw_documents, fixed_vocab)
1205 values = _make_int_array()
1206 indptr.append(0)
-> 1207 for doc in raw_documents:
1208 feature_counter = {}
1209 for feature in analyze(doc):
TypeError: 'Data' object is not iterable
你收到的错误是因为
TfidfVectorizer
是为了处理文本语料库而设计的。它期望输入是一个字符串列表或可迭代对象,其中每个字符串代表一个文档。你正在将整个数据框传递给它,这就是导致错误的原因。
以下是一种将数据框的每一行表示为向量并计算相似度的方法:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
data = {
'Col 0': [12, 13, 14],
'Col 1': ['65e1e35b7fe333', '65e1e35b7fe599', '65e1e35b7fe165'],
'Col 2': ['harry Joe', 'allen', 'carter'],
'Col 3': [1, 1, 1],
'Col 4': [False, False, False],
'Col 5': ['swe', 'swe', 'swe'],
'Col 6': [1, 1, 1],
'Col 7': ['142.158.0.2', '142.158.0.20', '142.158.0.21'],
'Col 8': ['10.10.0.2', '10.10.0.20', '10.10.0.21'],
'Col 9': ['text1', 'text2', 'text3'],
'Col 10': [0, 0, 0]
}
df = pd.DataFrame(data)
# 将所有列转换为字符串类型
df = df.astype(str)
# 将每一行连接成一个字符串
documents = df.apply(lambda x: ' '.join(x), axis=1)
# 使用 TF-IDF 将文档转换为向量
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(documents)
# 计算向量之间的余弦相似度
similarity_matrix = cosine_similarity(vectors)
# 将相似度矩阵打印为数据框(可选)
similarity_df = pd.DataFrame(similarity_matrix, index=df.index, columns=df.index)
print(similarity_df)
说明:
- 数据预处理:
-
首先,我们将数据框中的所有列转换为字符串类型。这是必要的,因为
TfidfVectorizer
是为了处理文本数据而设计的。 -
接下来,我们使用
apply
方法和一个 lambda 函数将每一行连接成一个字符串。这将创建我们文档语料库,其中每个文档代表数据框中的一行。 -
特征向量化:
-
我们创建一个
TfidfVectorizer
对象,它将使用词频-逆文档频率 (TF-IDF) 技术将我们的文档转换为数值向量。TF-IDF 是一种统计度量,它反映了一个词语对语料库中一份文档的重要性。 -
fit_transform
方法对文档进行拟合,计算每个词语的 TF-IDF 分数,并将文档转换为向量。 -
相似度计算:
-
我们使用
cosine_similarity
函数计算向量之间的成对余弦相似度。余弦相似度是一种度量两个向量之间相似度的度量。它计算两个向量夹角的余弦值。 -
结果(可选):
-
我们创建一个新的数据框
similarity_df
来以表格形式显示相似度矩阵。相似度矩阵中的每个单元格 (i, j) 表示文档 i 和文档 j 之间的相似度分数。
这个过程将为你提供一个相似度矩阵,其中包含数据框中每一行对之间的相似度分数。
标签:python,pandas,dataframe,vector,scikit-learn From: 78845582