我正在使用带有自定义模型的spaCy'3.0.0rc2'
。不幸的是,我的训练数据中连字符(-(较少,因此连字符经常被标记为NOUN
。
是否有某种方法可以强制某个tag
或pos
,以确保所有的-
令牌都标记有PUNCT
?
基本上,我正在寻找一个解决方案,就像在这里回答这个问题时提出的那样:如何在标记器之前/之后在spacy中强制使用pos标记?
不幸的是,这似乎不再适用于(至少对于spaCy 3(,并引发了一个错误:
ValueError: [E1005] Unable to set attribute 'POS' in tokenizer exception for '{G}'. Tokenizer exceptions are only allowed to specify ORTH and NORM.
(尝试分配TAG
属性时相同(
我知道可以创建一个带有Matcher
的自定义组件,该组件只查找连字符并分配正确的标记。然而,考虑到我目前只想处理一个令牌,这似乎有些过头了。
在使用自定义组件进行处理的过程中,是否有一些方法可以强制spaCy 3,中的标记而不重新标记?
理想情况下,我希望修改TAG
属性,并让spaCy根据TAG
属性自动分配POS
属性。如同在空间注释中一样,CCD_ 12应当被映射到CCD_。
在spaCy v3中,类似这样的异常可以在attribute_ruler
组件中实现:
ruler = nlp.add_pipe("attribute_ruler")
patterns = [[{"ORTH": "-"}]]
attrs = {"TAG": "HYPH", "POS": "PUNCT"}
ruler.add(patterns=patterns, attrs=attrs)
请注意,属性标尺根据初始Doc
状态运行模式匹配一次,因此不能将一个规则的输出属性用作另一个规则中的输入模式。这出现在像en_core_web_sm
这样的管道中,其中包含的属性标尺执行标记->pos映射。因此,如果您有另一个应该在pos模式上匹配的规则,则必须添加第二个属性标尺组件来处理这些情况。
请参阅:https://nightly.spacy.io/api/attributeruler
正确的方法是首先通过以下方式获取attribute_ruler的现有实例:ruler = nlp.get_pipe("attribute_ruler")
。
以下是官方指南中的完整示例:
nlp = spacy.load("en_core_web_sm")
text = "I saw The Who perform. Who did you see?"
doc1 = nlp(text)
print(doc1[2].tag_, doc1[2].pos_) # DT DET
print(doc1[3].tag_, doc1[3].pos_) # WP PRON
# Add attribute ruler with exception for "The Who" as NNP/PROPN NNP/PROPN
ruler = nlp.get_pipe("attribute_ruler")
# Pattern to match "The Who"
patterns = [[{"LOWER": "the"}, {"TEXT": "Who"}]]
# The attributes to assign to the matched token
attrs = {"TAG": "NNP", "POS": "PROPN"}
# Add rules to the attribute ruler
ruler.add(patterns=patterns, attrs=attrs, index=0) # "The" in "The Who"
ruler.add(patterns=patterns, attrs=attrs, index=1) # "Who" in "The Who"
doc2 = nlp(text)
print(doc2[2].tag_, doc2[2].pos_) # NNP PROPN
print(doc2[3].tag_, doc2[3].pos_) # NNP PROPN
# The second "Who" remains unmodified
print(doc2[5].tag_, doc2[5].pos_) # WP PRON