我输入的句子包含需要匹配的自定义多词实体,因此,为此,我使用了出色的{{3}}库。但是,它有一个缺陷。它无法识别它作为实体的句子中的复数单词。例如,如果我将link
声明为实体,并以banana
作为句子,它将不会识别short blue bananas
是一个实体。我目前对此的“解决方法”是执行以下操作:
bananas
基本上在原始句子上运行nlp,并将引理串在一起以创建新句子。但是,这将要求我在经过修饰的句子上运行nlp以提取具有spacy-lookup的实体,这简直就是……不对。我是否在管道中缺少某种东西,可以使spacy-lookup来检查引理而不是原始单词,因此只需要调用nlp一次?
答案 0 :(得分:0)
您可以从WordNet lemmatizer
模块中使用NLTK
,如下所示:
>>> import nltk
>>> from nltk.stem import WordNetLemmatizer
>>>
>>> wordnet_lemmatizer = WordNetLemmatizer()
>>> wordnet_lemmatizer.lemmatize("bananas")
banana
因此,根据您的示例,您可以执行以下操作:
sentence = "short blue bananas"
for word in sentence.split(" "):
word = word.lower()
print(wordnet_lemmatizer.lemmatize(word))
它将打印short blue banana
如果您不知道如何使用nltk
..请按照以下步骤操作:
pip install nltk
$ python
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nltk
>>> nltk.download('popular')
>>> nltk.download('wordnet')
答案 1 :(得分:0)
您不会错过任何明显的解决方案来使伪装查询看引理。 spacy-lookup直接在自述文件中(在用法部分的最后)说:“ spacy-lookup
只关心令牌文本”
您必须更改spacy-lookup才能使其在here周围执行您想要的操作:
matches = self.keyword_processor.extract_keywords(doc.text, span_info=True)
您可以将doc.text
更改为此处的其他内容(例如' '.join([token.lemma_ for token in doc])
),但随后会遇到问题,因为spacy-lookup依赖于文档文本中的字符偏移量来处理实体范围,因此您必须重新设计实体范围检测/合并,以使其使用标记偏移量而不是字符偏移量来使实体与原始文档文本对齐。 (这是可行的,但是有点麻烦。)
如果您只需要实体查找,则可以使用spacy(或NLTK或其他方式)生成引理,然后单独使用flashtext查找实体,从而完全跳过spacy-lookup。如果您不需要任何进一步的伪造分析,那么这将是最简单的选择。
其他说明:
spacy-lookup似乎具有不区分大小写的搜索选项(通过传递给flashtext的选项)
如果您想使用spacy,并且spacy的lemmatization足以满足您的需要(请仔细检查!),则无需使用NLTK;您可以创建更快的管道来禁用不需要的组件:
nlp = spacy.load('en', disable=['tagger', 'parser', 'ner'])