Обнаружение фразы с использованием PhrasesTransformer - PullRequest
0 голосов
/ 28 апреля 2020
from gensim.sklearn_api.phrases import PhrasesTransformer

# Create the model. Make sure no term is ignored and combinations seen 3+ times are captured.
m = PhrasesTransformer(min_count=1, threshold=3)
text = [['I', 'love', 'computer', 'science', 'computer', 'science', 'is', 'my', 'passion', 'I', 'studied', 'computer', 'science']]

# Use sklearn fit_transform to see the transformation.
# Since computer and science were seen together 3+ times they are considered a phrase.
m.fit_transform(text)

Приведенный выше код возвращает computer_science, как и ожидалось. Но как правильно прагматично извлекать фразы?

1 Ответ

0 голосов
/ 29 апреля 2020

PhrasesTransformer оборачивает экземпляр модели Phrases от gensim, которая выполняет фактическую компиляцию статистики совпадений и продвижение биграмм во фразы.

К сожалению, объект Phrases не предоставляет, по крайней мере, до gensim-3.8.3 (апрель 2020 года), список всех фраз, которые он может испускать. По сути, он просто компилирует статистику, а затем, когда он представлен с новым текстом, проверяет, какие биграммы должны быть объединены (в соответствии с его текущей статистикой и параметрами).

Недостатками этого подхода являются:

  • множество избыточных пересчетов
  • нет удобного списка «всех» возможных фраз
  • сохраняет потенциальные фразы, занимающие память, которые не соответствуют текущим параметрам оценки / порога, но могут, если они изменились

Недостатки этого подхода включают:

  • изменение оценки Параметры / threshold могут немедленно включить новые фразы

Чтобы фактически получить список фраз, которые может создать экземпляр Phrases, вам нужно передать в него текст всеми потенциальными фразами и посмотреть, что он продвигает. Вероятно, это должен быть служебный метод в gensim Phrases - поскольку очень похожее перечисление уже сделано внутри инициализации связанного класса Phraser - но это не так. Такой метод может работать примерно так (могут быть ошибки, поскольку я его не тестировал):

from gensim.models.phrases import pseudocorpus

def report_all_phrases(phrases_model):
    corpus = pseudocorpus(phrases_model.vocab, phrases_model.delimiter, phrases_model.common_terms)
    phrasegrams = set()
    for bigram, score in phrases_model.export_phrases(corpus, self.delimiter, as_tuples=True):
        phrasegrams.add(bigram)
    return phrasegrams
...