2017-01-06 1 views
0

У меня есть 4 таблицы со схемой (app, text_id, title, text). Теперь я хотел бы вычислить схожесть косинусов между всеми возможными текстовыми парами (заголовок текст конкатенированный) и сохранить их в конечном итоге в файле csv с полями (app1, app2, text_id1, text1, text_id2, text2, cosine_similarity).Вычислить сходство косинусов всех возможных пар символов, полученных из 4 таблиц mysql

Поскольку существует много возможных комбинаций, он должен работать достаточно эффективно. Какой из них наиболее распространен? Я был бы признателен за любые указания.

Редактировать: Хотя приведенная ссылка может затронуть мою проблему, я все еще не могу понять, как подойти к этому. Может ли кто-нибудь предоставить более подробную информацию о стратегии для выполнения этой задачи? Рядом с вычисленным сходством косинуса мне нужны также соответствующие пары текста в качестве вывода.

+0

Возможный дубликат [Что это самый быстрый способ в Python для вычисления косинуса сходства заданного разреженных данных матрицы?] (Http://stackoverflow.com/questions/17627219/whats-the-fastest-way-in-python -to-calculate-cosine-Similar-given-sparse-mat) –

ответ

4

Ниже приведен минимальный пример для вычисления сходства парного косинуса между набором документов (при условии, что вы успешно получили заголовок и текст из своей базы данных).

from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.metrics.pairwise import cosine_similarity 

# Assume thats the data we have (4 short documents) 
data = [ 
    'I like beer and pizza', 
    'I love pizza and pasta', 
    'I prefer wine over beer', 
    'Thou shalt not pass' 
] 

# Vectorise the data 
vec = TfidfVectorizer() 
X = vec.fit_transform(data) # `X` will now be a TF-IDF representation of the data, the first row of `X` corresponds to the first sentence in `data` 

# Calculate the pairwise cosine similarities (depending on the amount of data that you are going to have this could take a while) 
S = cosine_similarity(X) 

''' 
S looks as follows: 
array([[ 1.  , 0.4078538 , 0.19297924, 0.  ], 
     [ 0.4078538 , 1.  , 0.  , 0.  ], 
     [ 0.19297924, 0.  , 1.  , 0.  ], 
     [ 0.  , 0.  , 0.  , 1.  ]]) 

The first row of `S` contains the cosine similarities to every other element in `X`. 
For example the cosine similarity of the first sentence to the third sentence is ~0.193. 
Obviously the similarity of every sentence/document to itself is 1 (hence the diagonal of the sim matrix will be all ones). 
Given that all indices are consistent it is straightforward to extract the corresponding sentences to the similarities. 
''' 
+0

Это отлично работает, спасибо. На основании этого у меня есть еще два вопроса: Во-первых, мне нужно выполнить итерацию по массиву и проверить, где косинус> = 0.8, а затем мне нужно как-то получить пары документов (а не только позицию в массиве, но также название документов). Как бы вы это сделали? Во-вторых, у меня много данных, поэтому стоимость вычислений является проблемой. Можно ли вычислить только половину матрицы, так как она все равно симметрична? –

+0

@ EmanuelGeorge вы можете получить индексы из 'S', выполнив' np.where (S> = 0.8) 'или порождая весь массив, выполнив' S [S <0.8] = 0', который устанавливает все элементы с a sim <= 0,8-0. Единственная запись в 'S' представляет сходство между парой документов (индекс 0/1) - это сходство между документом 0 и документом 1). Если у вас есть список с именами документов, то сопоставление с S в списке имен документов прост. 'sklearn' очень эффективен, я не думаю, что он будет вычислять что-нибудь дважды. – tttthomasssss

Смежные вопросы