根据关键字/短语的固定列表从文档中提取关键字

时间:2019-03-26 15:00:29

标签: python nlp nltk spacy ner

我有大约100个关键字的列表,我需要在超过10万个文档的庞大语料库中进行搜索。

我不希望有完全匹配的内容,例如,如果关键字是Growth Fund,那么我希望所有匹配项都如Growth Fund,America Growth Fund等。

对此有何建议?

我尝试使用spacy的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 :(得分:0)

我目前正在从事非常相似的工作。 我们有多种选择,这是一个快速选择:

  • 使用“ a in b”进行迭代。尽管非常简单,但是它却非常强大,并且即使不是理想选择,如果只对这些关键字进行一次检查,也可以找到大部分的局部匹配项(如果复数仅是's',则“ matches”中的“ match” ==是的)

  • 将您的语料库存储在Postgresql中,并使用内置的全文搜索option,这是非常强大的。这比较重,但是如果您需要对关键字进行多次迭代,则将为您提供帮助,因为您只需执行一次转换即可。 参见:https://www.compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/

由于我不是专家,所以我愿意接受任何见解,并且知道这可能不是最佳答案。 但是至少您还有一些事情要做。

答案 1 :(得分:0)

我建议您使用Python的Fuzzywuzzy库,因为您不需要精确匹配,它使用Levenshtein距离算法。找出短语会更准确。

参考链接-https://github.com/seatgeek/fuzzywuzzy

答案 2 :(得分:0)

有多种选择,我建议您先在语料库上使用lemmatization。我不知道您需要使用多少个命名实体,因此您可能需要考虑一种针对它们的特定方法(词法化在那里无济于事-但正如其他人所述,A in B可能会有所帮助,或者您可以将它们作为个别案例添加到SpaCy中)。另一种建议是在word2vec(或其他文本嵌入)模型中使用元组,并检查与您要避免重复的某些单词的k个最相似的单词,并以此通知任何您想具体说明的情况报到。 查找可能要考虑的短语的另一个快速选择是导入模型(gensim有一些),然后提取模型中没有的任何短语/单词-这很可能会使您获得大量的命名实体,因此您知道您必须考虑的情况。