Doc2ve c максимальная оценка сходства документа с подмножеством документов - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в doc2ve c. У меня есть фрейм данных с двумя столбцами: один - это идентификатор (patent_number), другой - очищенный и токенизированный текст (clean_description). Для каждого идентификатора мне нужно сгенерировать в 3-м столбце (max_similarity) максимальное значение сходства clean_description с подмножеством clean_description, принадлежащим идентификаторам в списке с именем patents_snow_banch, который идентифицирует подмножество -dataframe. Вот выдержка из 7528 наблюдений во фрейме данных:

   clean_description                                         patent_number
0  ['detailed', 'description', 'preferred', 'embodied']          3930647
1  ['referring', 'first', 'fig', 'ski', 'comprise']              3930658
2  ['description', 'preferred', 'embodiments', 'solution']       3930659
...

Мой текущий подход состоит в том, чтобы сгенерировать матрицу сходства 7528X7528 и извлечь максимальное значение для каждого patent_number из подмножества, обозначенного patents_snow_banch, но я полностью открыт для других подходов

Я использовал doc2ve c, чтобы измерить, насколько каждый clean_description похож на каждый другой clean_descriptions в кадре данных, и создать матрицу сходства 7528X7528

sample = df[['clean_description', 'patent_number']]
class MyDataframeCorpus(object):
    def __init__(self, source_df, text_col, tag_col):
        self.source_df = source_df
        self.text_col = text_col
        self.tag_col = tag_col

    def __iter__(self):
        for i, row in self.source_df.iterrows():
            yield TaggedDocument(words=simple_preprocess(row[self.text_col]), 
                                 tags=[row[self.tag_col]])

corpus_for_doc2vec = MyDataframeCorpus(sample , 'clean_description', 'patent_number')

model = Doc2Vec(vector_size=100, window=20, min_count=5, workers=11,alpha=0.025, epochs=20)
model.build_vocab(corpus_for_doc2vec)
model.train(corpus_for_doc2vec,total_examples=model.corpus_count, epochs=model.epochs)

similarity_matrix = []
index = similarities.MatrixSimilarity(matutils.Dense2Corpus(model.wv.vectors.T))

for sims in index:
    similarity_matrix.append(sims)
similarity_array = np.array(similarity_matrix)

Обучение модели, похоже, работает нормально (насколько мне известно), но матрица результатов (similarity_array) составляет 16321X16321 вместо 7528X7528.

Предполагая, что эта проблема разрешима и Я могу получить правильную матрицу 7528X7528, затем мне нужно найти для каждого наблюдения максимальную оценку сходства с подмножеством идентификаторов в матрице, идентифицированной в списке с именем patents_snow_banch

Любые идеи о том, как это можно сделать быть сделано? Заранее спасибо

1 Ответ

0 голосов
/ 20 июня 2020

Я бы посоветовал вообще не использовать SimilarityMatrix и явно не пытаться вычислить все попарные сходства. Вместо этого просто используйте метод gensim .most_similar(), чтобы запросить единственный наиболее похожий элемент для каждого из ваших интересующих элементов.

Например, чтобы получить единственный наиболее похожий элемент для каждого из элементы в обучающем наборе, в списке в том же порядке, в котором они появились в обучающем наборе:

most_similars = [model.docvecs.most_similar(doc.tags[0], topn=1) 
                 for doc in corpus_for_doc2vec]

Это фактически будет хранить как тег аналогичного документа, так и его оценку сходства - вы можете просто сохраните model.docvecs.most_similar(doc.tags[0], topn=1)[0], если вам нужен только тег.

(Хотя на мгновение внутри .most_similar() все попарные сходства будут рассчитаны и отсортированы для одной цели, вы не сохраните все меньше -чем наилучшее сходство в большой матрице.)

В качестве альтернативы вы можете сохранить результаты в dict, если вместо этого хотите искать самые популярные совпадения по ключу patent_number, а не по порядковому номеру:

most_similars_by_key = {}
for doc in corpus_for_doc2vec:
    most_similars_by_key[doc.tags[0]] = model.docvecs.most_similar(doc.tags[0], topn=1)
...