Извлечение ключевых слов из документов на основе фиксированного списка ключевых слов / фраз - PullRequest
0 голосов
/ 26 марта 2019

У меня есть список из примерно 100 ключевых слов, и мне нужно искать их в огромном корпусе из более чем 0,1 миллиона документов.

Мне не нужно точное соответствие, например, если ключевым словом является Фонд роста, я ожидаю все совпадения, такие как фонды роста, фонд роста Америки и т. Д.

Есть предложения по этому поводу?

Я пытался использовать sprase's PhraseMatcher, но он выдает ValueError: [T001] Максимальная длина в настоящее время 10 для соответствия фраз.

import spacy
from spacy.matcher import PhraseMatcher

full_funds_list_flat = "<list of 100+ Keywords>"


nlp = spacy.load('en_core_web_sm')
keyword_patterns = [nlp(text) for text in full_funds_list_flat]
matcher = PhraseMatcher(nlp.vocab)
matcher.add('KEYWORD', None, *keyword_patterns)

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

Я бы порекомендовал вам использовать нечеткую библиотеку Python, поскольку вам не нужно точное совпадение, она использует алгоритм расстояния Левенштейна. Который будет более точным, чтобы узнать фразы.

ссылка - https://github.com/seatgeek/fuzzywuzzy

0 голосов
/ 27 марта 2019

Есть несколько вариантов, я бы рекомендовал сначала использовать лемматизацию в вашем корпусе. Я не знаю, с какими именованными объектами вам нужно работать, поэтому вы можете рассмотреть конкретный подход к ним (лемматизация там не поможет - но, как уже упоминал кто-то, A в B может помочь, или вы могли бы добавить их как отдельные случаи в SpaCy). Еще одна рекомендация - использовать кортежи в модели word2vec (или другого встраивания текста) и проверить наличие k-наиболее похожих слов для некоторых слов, которые вы хотите избежать повторений, и использовать это для информирования о любых случаях, которые вы хотите специально регистрироваться. Еще один быстрый способ найти возможные фразы, которые следует рассмотреть в первую очередь, - это импортировать модель (у gensim есть некоторые) и просто извлечь любые фразы / слова, которых нет в модели - это, вероятно, даст вам много названных сущностей, чтобы вы знали, что случаи, которые вы должны рассмотреть.

0 голосов
/ 26 марта 2019

Я сейчас работаю над чем-то похожим.У нас есть несколько вариантов, вот быстрый выбор:

  • Выполните итерацию, используя «a in b».Несмотря на то, что это довольно просто, это чрезвычайно эффективно, и хотя это и не идеально, но если это одноразовая проверка для этих ключевых слов, вы можете найти наиболее частичное совпадение (если во множественном числе только 's', "match" в "match" ==Верно)

  • Сохраните ваш корпус в Postgresql и используйте встроенную опцию полнотекстового поиска, что довольно сильно.Это тяжелее, но поможет вам, если вам нужно многократно повторять ключевое слово, так как вы выполняете преобразование только один раз.см .: https://www.compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...