Nlp 有没有办法关闭Spacy中特定的内置标记化规则?

Nlp 有没有办法关闭Spacy中特定的内置标记化规则?,nlp,tokenize,spacy,Nlp,Tokenize,Spacy,Spacy自动将诸如“dont”和“dont”之类的单词缩略语标记为“do”和“nt”/“t”。例如,像“我不懂”这样的句子将被标记为:[“我”、“做”、“新台币”、“懂”] 我知道这在许多NLP任务中通常是有用的,但是有没有一种方法可以抑制这一点,使结果变成[“我”、“不”、“理解”] 这是因为我正在尝试评估我的自定义Spacy-NER模型的性能(生物标记方案的f1分数),输入句子中的标记数量与谓词标记数量不匹配导致我的评估代码出现问题: 输入(3个标记):[(“I”,“O”),(“dont

Spacy自动将诸如“dont”和“dont”之类的单词缩略语标记为“do”和“nt”/“t”。例如,像“我不懂”这样的句子将被标记为:[“我”、“做”、“新台币”、“懂”]

我知道这在许多NLP任务中通常是有用的,但是有没有一种方法可以抑制这一点,使结果变成[“我”、“不”、“理解”]

这是因为我正在尝试评估我的自定义Spacy-NER模型的性能(生物标记方案的f1分数),输入句子中的标记数量与谓词标记数量不匹配导致我的评估代码出现问题:

  • 输入(3个标记):[(“I”,“O”),(“dont”,“O”),(“understand”,“O”)]

  • 预测(4个代币):[(“I”、“O”)、(“do”、“O”)、(“nt”、“O”)、(“理解”、“O”)]


当然,如果有人对在Spacy中执行顺序标记任务的更好方法有任何建议(可能与软件包类似,但与Spacy的令牌格式更兼容),也将不胜感激。

特例标记化规则在相应的语言数据中定义(对于英文“nt”缩略词)。创建时,可以通过
rules
参数传入这些特例规则

方法1:使用不同的特例规则的自定义标记器 因此,对于您的用例,您可以做的一件事是使用相同的前缀、后缀和中缀规则重构英语
标记器
,但只使用一组经过筛选的标记器异常。标记器异常由字符串设置关键字,因此您可以删除
的“dont”项
以及您需要的任何其他内容。但是,代码非常冗长,因为您正在重建整个标记器:

从spacy.lang.en导入英语
从spacy.lang.标点导入标记器前缀、标记器后缀、标记器中缀
从spacy.lang.en导入标记器\u异常
从spacy.tokenizer导入标记器
从spacy.util导入编译前缀正则表达式、编译后缀正则表达式、编译中缀正则表达式
prefix\u re=compile\u prefix\u regex(标记器前缀)。搜索
后缀\u re=编译\u后缀\u正则表达式(标记器\u后缀)。搜索
中缀=编译中缀正则表达式(标记器中缀)。finditer
filtered_exc={key:key的值,TOKENIZER中的值_EXCEPTIONS.items()如果key不在[“dont”]}
nlp=英语()
标记器=标记器(
nlp.vocab,
前缀搜索=前缀搜索,
后缀搜索=后缀搜索,
中缀查找器=中缀查找器,
规则=过滤的_exc
)
nlp.tokenizer=标记器
doc=nlp(“我不明白”)
方法2:之后合并(或拆分)令牌 另一种方法是保持标记化的原样,但在顶部添加规则,将某些标记向后合并,以匹配所需的标记化。这显然在运行时会较慢,但可能更易于实现和推理,因为您可以从“哪些令牌当前被分离,但应该是一个?”。为此,您可以使用和将匹配的令牌合并回一起。从spaCy v2.1开始,如果相关,它还支持拆分

从spacy.lang.en导入英语
从spacy.matcher导入matcher
nlp=英语()
matcher=matcher(nlp.vocab)
模式=[{“较低”:“do”},{“较低”:“nt”}]]
add(“TO_MERGE”,None,*patterns)
doc=nlp(“我不明白”)
匹配=匹配器(文档)
使用doc.retokenize()作为retokenizer:
对于match_id,在matches中开始和结束:
span=doc[开始:结束]
重新排序器。合并(span)

上述模式将匹配两个令牌(每个令牌一个dict),其小写形式为“do”和“nt”(例如,“DONT”、“DONT”、“DONT”)。您可以将更多的dict列表添加到模式中,以描述其他令牌序列。对于每个匹配,您可以创建一个
Span
,并将其合并到一个令牌中。为了使此逻辑更加优雅,您还可以将其包装为,这样当您对文本调用
nlp
时,它会自动应用。

如果您需要空白标记器,请谢谢你的评论。我在考虑一个潜在的解决方案的时候考虑了这个问题,但我没有直接尝试,因为它不会像逗号和句号那样删除尾随标点符号。在看到你的评论后给了它一个镜头,结果证明这是一个很好的解决方案。在处理的输入数据中已经处理了非实时性。出于好奇,除了创建自己的自定义标记器并仅重新实现所需的规则之外,是否没有其他方法可以选择性地停用一些特例标记化规则?