Могу ли я получить матрицы Word2Vec и Doc2Vec для вычисления косинусного сходства? - PullRequest
0 голосов
/ 10 июля 2019

Я работаю с текстовыми данными, и в данный момент я поместил свои данные в матрицу терминологического документа и вычислил TF, частоту терминов и TF-IDF, частоту инвертированной частоты документов.Отсюда моя матрица выглядит следующим образом:

столбцы = имена документов

имена строк = слова

, заполненные их оценками TF и ​​TF-IDF.

Я использовал пакет tm в R для большей части моего текущего анализа, но чтобы продолжить его, я начал играть с библиотекой gensim в Python.

Мне не ясно, если у меня есть вложения слова, как в TF и ​​TF-IDF.Я надеюсь использовать Word2Vec / Doc2Vec и получить матрицу, аналогичную той, которая у меня есть в настоящее время, а затем вычислить косинусное сходство между документами.Является ли это одним из выходных данных моделей?

В основном у меня есть около 6000 документов. Я хочу вычислить косинусное сходство между ними и затем оценить эти оценки косинусного сходства.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Да, вы можете обучить модели Word2Vec или Doc2Vec вашим текстам. (Хотя ваши данные немного малы для этих алгоритмов.)

Впоследствии, с моделью Word2Vec (или некоторыми режимами Doc2Vec) у вас будут слова-векторы для всех слов в ваших текстах. Один простой способ затем создать вектор для более длинного текста - это усреднить вместе все векторы для отдельных слов текста. Затем с вектором для каждого текста вы можете сравнивать тексты, вычисляя косинус-подобие их векторов.

В качестве альтернативы, с моделью Doc2Vec вы можете (а) найти изученные векторы документов для текстов, которые были в обучающем наборе; или (b) используйте infer_vector() для подачи нового текста, который следует маркировать так же, как данные обучения, и получите совместимый с моделью вектор для этого нового текста.

1 голос
/ 10 июля 2019

Документация говорит, что возвращает выведенный вектор абзаца для нового документа.Обратите внимание, что последующие вызовы этой функции могут выводить разные представления для одного и того же документа (вы можете сделать его детерминированным, жестко закодировав начальное число model.random.seed(0)).

Чаще всего используется sklearn для сходства tfidf и косинуса

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

corpus = [
     'This is the first document',
     'This is the second second document',
     'And the third one',
]

vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
similarity_matrix = cosine_similarity(tfidf)

Doc2Vec использует консиноподобие под капотом, поэтому я считаю, что вы можете использовать эти векторы для этой цели.

import gensim  

model = gensim.models.Doc2Vec.load('saved_doc2vec_model')  
new_sentence = "This is a sample document".split(" ")  
model.docvecs.most_similar([model.infer_vector(new_sentence)])

Это вернет кортеж (label,cosine_similarity_score) наиболее похожих документов.

Надеюсь, это поможет.

...