Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于固定的关键字/短语列表从文档中提取关键字_Python_Nlp_Nltk_Spacy_Ner - Fatal编程技术网

Python 基于固定的关键字/短语列表从文档中提取关键字

Python 基于固定的关键字/短语列表从文档中提取关键字,python,nlp,nltk,spacy,ner,Python,Nlp,Nltk,Spacy,Ner,我有一个大约100个关键字的列表,我需要在超过10万个文档的庞大语料库中搜索它们 我不想要一个精确的匹配,例如,如果关键字是成长基金,我期待所有的匹配,如成长基金,美国成长基金等 有什么建议吗 我曾尝试使用spacy的短语匹配器,但它给出了一个ValueError:[T001]当前短语匹配的最大长度为10 导入空间 从spacy.matcher导入短语匹配器 完整资金清单扁平=“” nlp=spacy.load('en\u core\u web\u sm') 关键字\u模式=[nlp(文本)用于

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

我不想要一个精确的匹配,例如,如果关键字是成长基金,我期待所有的匹配,如成长基金,美国成长基金等

有什么建议吗

我曾尝试使用spacy的短语匹配器,但它给出了一个ValueError:[T001]当前短语匹配的最大长度为10

导入空间
从spacy.matcher导入短语匹配器
完整资金清单扁平=“”
nlp=spacy.load('en\u core\u web\u sm')
关键字\u模式=[nlp(文本)用于全文\u基金\u列表\u平面中的文本]
matcher=短语匹配器(nlp.vocab)
添加('KEYWORD',None,*关键字\u模式)

我目前正在做类似的事情。 我们有多种选择,这里有一个快速选择:

  • 使用“b中的a”进行迭代。虽然非常简单,但这是非常强大的,即使不理想,如果一次性检查这些关键字,您可以找到大部分部分匹配(如果复数仅为“s”,则“matches”中的“match”==True)

  • 将语料库存储在Postgresql中,并使用内置的全文搜索选项,这一功能非常强大。这会更重,但是如果您需要对关键字进行多次迭代,这会对您有所帮助,因为您只需执行一次转换。 见:

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

我建议你使用Python的模糊模糊库,因为你不需要精确匹配,它使用Levenshtein距离算法。哪一个会更准确地找出短语


参考链接-

有多种选择,我建议首先在语料库中使用柠檬化。我不知道你需要和多少个命名实体一起工作,所以你可能想为他们考虑一个特定的方法(LeMeMixy不会有帮助),但是正如其他人提到的,A在B中可以帮助,或者你可以把它们作为单独的案例添加到SPACY中。另一个建议是在word2vec(或其他文本嵌入)模型中使用元组,检查与您希望避免重复的某些单词最相似的k个单词,并使用它通知您希望特别签入的任何情况。
另一个快速的选项来寻找第一个可能要考虑的短语是导入模型(GEnSIM有一些),并且只提取不在模型中的任何短语/单词,这可能会给你很多命名实体,这样你就知道你要考虑什么情况。也许认为世界上大多数人都不知道拉克语。“ChristianSloper,我的坏孩子,edited@KeshavKumar欢迎有趣的问题。你能展示一下你试过的吗?此外,我想到的一些概念可能会有所帮助——柠檬化、命名实体分块和并行化。前两个问题在NLP的任何好的介绍中都会提到。后者只是大型ish语料库的常识。@fiacre谢谢:)用我试过的代码编辑了这个问题。我正在对这些标记进行柠檬化,然后将其传递给短语匹配器。至于命名实体分块,因为我必须找到的单词列表不属于任何预定义的命名实体,甚至我也不可能手动标记数据,所以训练自定义NER模型似乎很困难。非常感谢,如果还有其他事情发生,请务必提出建议。谢谢。我一定会尝试第二个选项并更新。从第一个开始,我理解的是,您想要标记文档并查找列表中的每个标记?就像列表中的令牌一样。正如您正确地说的,如果是一次性检查就好了,但在我的情况下,它的连续过程和对每个令牌的列表进行迭代检查的成本太高了,我想,请让我知道您的想法。您可以使用Lucene引擎,而不是使用成熟的数据库(可通过Python获得。它正是针对您手头的问题量身定制的。我不推荐levenshtein-它告诉您两个单词之间有多少字母是替换/删除/添加的字符-这不会告诉您两个单词是同义词。我无法对FuzzyWzzy库发表评论,但levenshtein没有lp与同义词。Levenshtein距离(LD)是两个字符串之间相似性的度量,因为我们不需要字符串的精确匹配,我们可以使用fuzzywuzzy库找到模糊比率。