强制spaMy引理小写

问题描述

是否可以将标记文本保留为大写,但可以强制将引号转换为小写?我对此很感兴趣,因为我想使用PhraseMatcher来通过pipleline运行输入文本,然后在该文本上搜索匹配的短语,其中每个搜索查询是否区分大小写。如果我按引理进行搜索,则认情况下我希望搜索不区分大小写。

例如

doc = nlp(text)

for query in queries:
    if case1:
         attr = "LemmA"
    elif case2:
         attr = "ORTH"
    elif case3:
         attr = "LOWER"
    phrase_matcher = PhraseMatcher(self.vocab,attr=attr)
    phrase_matcher.add(key,query)
    matches = phrase_matcher(doc)

在第一种情况下,我希望匹配不区分大小写,并且如果spaCy库中有一些东西可以强制认情况下将小写字母改成小写,那么这比保留多个文档版本和强制使用一个版本要有效得多。具有所有小写字符。

解决方法

spacy的这一部分在各个版本之间都在变化,我上次查看lemmatization是几个版本之前。因此,此解决方案可能不是最优雅的解决方案,但绝对是一个简单的解决方案:

# Create a pipe that converts lemmas to lower case:
def lower_case_lemmas(doc) :
    for token in doc :
        token.lemma_ = token.lemma_.lower()
    return doc

# Add it to the pipeline
nlp.add_pipe(lower_case_lemmas,name="lower_case_lemmas",after="tagger")

您将需要弄清楚将其添加到管道中的哪个位置。最新文档提到Lemmatizer使用POS标记信息,因此我不确定在什么时候调用它。在tagger之后放置管道是安全的,届时应找出所有引理。

我可以想到的另一种选择是从Lemmatizer类派生自定义lemmatizer并覆盖其__call__方法,但是这很可能具有很大的侵入性,因为您需要弄清楚如何(和在哪里)插入您自己的lemmatizer。