在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