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



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

我不想要完全匹配,例如,如果关键字是增长基金,我期待所有匹配,如增长基金、美国成长基金等。

对此有什么建议吗?

我尝试使用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)

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

  • 使用"a in b"进行迭代。虽然很简单,但这非常强大,即使不理想,如果是对这些关键字的一次性检查,你可以找到最部分匹配(如果复数只是's',"matches"中的"match"== True(

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

由于我不是专家,我对任何见解都持开放态度,并且知道这可能不是最好的答案。但至少你有一些事情要做。

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

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

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

最新更新