Расчет косинусного сходства векторов TFIDF Vectorizer одного и того же документа, но разной длины - PullRequest
0 голосов
/ 12 апреля 2019

Ожидаемые результаты и краткое изложение того, что я хочу сделать:

1. From one list, I have created one another list based on frequency, so we have two lists: `Original list` and `Frequent items list` ( frequent item list is subset of original list)
2. Calculating TFIDF vector for each elements in both list.
3. For each items in `Frequent items list` , I have to get cosine similarity for each items in `Original list`
4. If cosine similarity is greater then some threshold then I will add that element into set otherwise not.
5. So, I want a dictionary having keys as each elements of  `Frequent items list` and value is set of elements having cosine similarity greater than some threshold.

Используя векторизатор TFIDF, я вычислил векторы для обоих списков, и из-за разного размера векторов мне не удалось получить косинусное сходство.

Ниже приведен код для расчетного распределения частоты для исходного списка:

import nltk
bigram_freq_dist = nltk.FreqDist(original_list)

Результаты:

FreqDist({'time picked': 8, 'picked drop': 7, 'bus good': 5, 'good bus': 5, 'best service': 4, 'rest stop': 4, 'comfortable journey': 4, 'good service': 4, 'everything good': 3, 'staff behaviour': 3, ...})

Из этого условия распределения частот я взял несколько предметов с частотой> 2:

bi_vector_list = []

for name, freq in bigram_freq_dist.items():
    if freq >= 2:
        bi_vector_list.append(name)

Расчетный вектор TFIDF для биграмм:

#for top frequency element
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(ngram_range=(2,2))
vectors = vectorizer.fit_transform(bi_vector_list)
bivectors = vectors.toarray()

Форма:

bivectors.shape = (23,23)

Для всех элементов:

#for all element
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer_all = TfidfVectorizer(ngram_range=(2,2))
vectors_all = vectorizer_all.fit_transform(original_list)
bivectors_all = vectors_all.toarray()

Список форм оригинала:

bivectors_all.shape  = (1170, 1071)

Расчет косинуса сходства:

#cosine similarity
from sklearn.metrics.pairwise import cosine_similarity

bi_sim_dict = dict()
for i in range(len(vectorizer.get_feature_names())):
    local_list = set()
    for vector in bivectors[0]:
            for j in range(len(vectorizer_all.get_feature_names())):
                for element_vector in bivector_elements[0]:
                    if cosine_similar(vector,element_vector) > 0.7:
                        local_list.add(vectorizer.get_feature_names()[j])

    bi_sim_dict[vectorizer.get_feature_names()[i]] = local_list

Сходство косинусов:

def cosine_similar(vector1,vector2):
    similarity = cosine_similarity([vector1,vector2])
    return similarity

Получение ошибки формы, и я знаю, почему эта ошибка появляется.

...