在SO和Web上有几个问题描述如何在两个字符串之间采用cosine similarity
,甚至在TFIDF作为权重的两个字符串之间。但是像scikit的linear_kernel
这样的函数的输出让我有点困惑。使用TFIDF的余弦相似度
考虑下面的代码:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
a = ['hello world', 'my name is', 'what is your name?']
b = ['my name is', 'hello world', 'my name is what?']
df = pd.DataFrame(data={'a':a, 'b':b})
df['ab'] = df.apply(lambda x : x['a'] + ' ' + x['b'], axis=1)
print(df.head())
a b ab
0 hello world my name is hello world my name is
1 my name is hello world my name is hello world
2 what is your name? my name is what? what is your name? my name is what?
问题: 我想有一列,它是在a
字符串和b
琴弦之间的余弦相似性。
我试过:
我培养了TFIDF分类上ab
,以包括所有的话:
clf = TfidfVectorizer(ngram_range=(1, 1), stop_words='english')
clf.fit(df['ab'])
然后我得到了两个a
和b
列的稀疏TFIDF矩阵:
tfidf_a = clf.transform(df['a'])
tfidf_b = clf.transform(df['b'])
现在,如果我使用scikit的linear_kernel
,这是别人推荐的,我得到了一个格式矩阵(nfeatures,nfeatures),正如他们的文档中提到的那样。
from sklearn.metrics.pairwise import linear_kernel
linear_kernel(tfidf_a,tfidf_b)
array([[ 0., 1., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
但我需要的是一个简单的矢量,其中所述第一元件是a
第一行和b
第一行,所述第二元件是所述cos_sim之间的cosin_sim(A [1],B [ 1])等等。
使用python3,scikit-learn 0.17。
谢谢,这工作。你为什么不跟我如何构建完整的语料库? – David
因为通常有比使用.apply这种类型的任务更好的方法。这里有6个文档,两列中有3行,是否有两个单独的文档(a和b),或者是否有3个文档(每行一个)。这对计算TFIDF中的频率很重要,我不确定您构建ab的方式现在反映了您的意图。 – flyingmeatball