Есть несколько вопросов по SO и в сети, описывающих, как взять cosine similarity
между двумя строками и даже между двумя строками с TFIDF в качестве весов. Но вывод такой функции, как linear_kernel
из scikit меня немного смущает.
Рассмотрим следующий код:
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'])
Затем я получил разреженную матрицу TFIDF из столбцов a
и b
:
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.]])
Но мне нужен простой вектор, где первым элементом является cosin_sim между первой строкой a
и первой строкой b
, вторым элементом является cos_sim (a [1], b [1]) и т. Д. .
Используя python3, scikit-learn 0.17.