问题描述
是否可以将标记文本保留为大写,但可以强制将引号转换为小写?我对此很感兴趣,因为我想使用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。