【问题标题】:Extracting keywords from documents based on a fixed list of keywords / phrases根据固定的关键字/短语列表从文档中提取关键字
【发布时间】:2019-03-26 15:00:28
【问题描述】:

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

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

对此有什么建议吗?

我尝试使用 spacy 的 PhraseMatcher,但它给出了 ValueError: [T001] Max length current 10 for phrase matching。

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)

【问题讨论】:

  • 也许考虑到 lakh 在世界大部分地区并不是一个众所周知的量词。
  • @ChristianSloper 我的错,已编辑
  • @KeshavKumar 欢迎。有趣的问题。你能展示你尝试过的东西吗?此外——还有一些概念可能会有所帮助——词形还原、命名实体分块和并行化。前两个在 NLP 的任何好的介绍中都得到了解决。后者只是大型语料库的常识。
  • @fiacre 谢谢 :) 用我尝试过的代码编辑了问题。在将令牌传递给短语匹配器之前,我正在对令牌进行词形还原。至于命名实体分块,由于我必须找到的单词列表不属于任何预定义的命名实体,甚至我无法手动标记数据,因此训练自定义 NER 模型似乎很困难。非常感谢,如果还有其他问题,请提出建议。

标签: python nlp nltk spacy named-entity-recognition


【解决方案1】:

我目前正在做一些非常相似的事情。 我们有多种选择,以下是一个快速选择:

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

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

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

【讨论】:

  • 谢谢。我一定会尝试第二个选项并更新。从我理解的第一个开始,您想对文档进行标记并在列表中查找每个标记?就像列表中的令牌。正如你所说的那样,如果它是一次检查会很好,但在我的情况下,它的连续过程和检查迭代每个令牌的列表将花费太多我猜,请让我知道你的想法。
  • 您可以使用 Lucene 引擎(通过 pylucene 在 Python 中提供该引擎,而不是使用成熟的数据库。它是为您手头的问题量身定制的。
【解决方案2】:

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

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

【讨论】:

  • 我不推荐levenshtein - 它告诉你两个单词之间有多少个字母替换/删除/添加的字符 - 这不会告诉你两个单词是同义词。我无法评论 Fuzzywuzzy 库,但 levenshtien 对同义词没有帮助。
  • Levenshtein 距离 (LD) 是衡量两个字符串之间相似性的指标,由于我们不需要字符串的完全匹配,我们可以使用fuzzywuzzy 库找到模糊率。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多