Как определить термины из списка в невидимых документах - PullRequest
0 голосов
/ 26 сентября 2019

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

terms= [
[t1],
[t2, t3],
[t4, t5, t6],
[t7],...]

и документы, в которых должны быть признаны эти термины, имеют вид:

docs = [
[w1, w2, t1, w3, w4, t7],        #d1
[w1, w4, t4, t5, t6, wi, ...],   #d2
[wj, t7, ..] ..]                 #d3

Желаемый результат должен быть

[2, 1, 1, ...]

Этоу первого документа есть два термина, представляющих интерес, у второго - 1 (состоит из трех слов) и т. д.

Если необходимо учитывать термины, где длина слова равна 1, то я мог бы легко заказать каждый документв алфавитном порядке удалите повторяющиеся термины (набор), а затем пересекаются с терминами размером 1 слово.Подсчет повторяющихся слов - результат поиска.

Но с условиями длины> = 2 вещи становятся хитрыми.

Я использовал gensim для формирования пакета слов и определения индексов при использованииновая фраза

например,

dict_terms = corpora.Dictionary(phrases)

sentence = unseen_docs[0]
idxs     = dict_terms[sentence]

И затем посчитайте количество идентификаторов, учитывая, являются ли индексы последовательными, это будет означать, что был замечен один термин, а не 2 o 3 из них.

Любые предложения.

1 Ответ

0 голосов
/ 27 сентября 2019

В Scikit-learn (очень популярный пакет Python для машинного обучения) есть Модуль, который делает именно то, что вы просите:

Вот как это сделать:

Первая установка sklearn

pip install scikit-learn

Теперь код:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(ngram_range=(1, 3))

#Given your corpus is an iterable of strings, or a List of strings, for simplicity:
corpus = [...]

X = vectorizer.fit_transform(corpus)

print(X)

На выходе получается матрица размером mx n.Например:

[[0 1 1 1 0 0 1 0 1]
 [0 2 0 1 0 1 1 0 1]
 [1 0 0 1 1 0 1 1 1]
 [0 1 1 1 0 0 1 0 1]]

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

Но как узнать, какие слова появляются и где?Вы можете получить имя каждого «столбца», используя:

print(vectorizer.get_feature_names())

Вы получите список слов (слова организованы в алфавитном порядке).

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

Матрица, которую вы получаете в качестве выходных данных, представляет собой массив «numpy» (другой пакет).Это можно легко сгладить (суммировать все строки), выполнив:

import numpy as np #np is like a convention for numpy, if you don't know this already.

sum_of_all_words = np.sum(X, axis=0)

Это даст вам что-то вроде:

[[1 4 2 4 1 1 4 1 4]]

Порядок столбцов для слов одинаков.

Наконец, вы можете отфильтровать термины из своего словаря, выполнив:

dict_terms = corpora.Dictionary(phrases)
counts = {}
words = vectorizer.get_feature_names()
for idx, word in enumerate(words):
   if word in dict_terms:
      counts[word] = sum_of_all_words[0, idx]


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

Подробнее о CountVectorizer можно узнать здесь: https://scikit -learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html#sklearn.feature_extraction.text.CountVectorizer

(Кроме того, посмотрите на TFIDFVectorizer, если вы используетеМножество слов, tf-idf - это огромное обновление в большинстве случаев)

Я также рекомендую вам взглянуть на эту страницу для извлечения функций с помощью sklearn: https://scikit -learn.org / stable/modules/feature_extraction.html

...