首页 > 解决方案 > 如何引用一些特殊的词(注册号)不被 Spacy 标记?

问题描述

我在文本中有一些数字,我想将其保留为一句话。他们中有一些:

7-2017-19121-B
7-2016-26132
wd/2012/0616
JLG486-01
H14-0890-12

我怎样才能保护他们不被言语分开。我已经将正则表达式用于自定义标记器,从不使用破折号分割单词,但它只适用于字母而不是数字。我不想更改很大且非常复杂的默认正则表达式。我怎样才能轻松做到?

我已经做的是使用那些“连字符保护器”。因为7-2014-1721-Y我得到了令牌[7,-,2014,-,1721-Y],所以最后一个短语没有分开,但前一个是。正如我所说,代码很复杂,希望添加相同的代码以包含数字实体的此类操作。

这是功能:

def custom_tokenizer(nlp):
    prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
    suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)
    # changing default infixed
    def_infx = nlp.Defaults.infixes    
    cur_infx = (d.replace('-|–|—|', '') for d in def_infx)
    infix_re = compile_infix_regex(cur_infx)

    return Tokenizer(nlp.vocab, prefix_search=prefix_re.search, suffix_search=suffix_re.search,
                                infix_finditer=infix_re.finditer, token_match=None)

也许除了修改之外还有一些更简单的方法?我试图用一些转义字符来引用这些“盘子”,{7-2017-19121-B}但它不起作用。

顺便说一句,有一个匹配这些特殊“数字”的正则表达式。也许对我来说解决方法只是将它们从文本中删除(我稍后会尝试)但现在我问我是否有机会。

["(?=[^\d\s]*\d)(?:[a-zA-Z\d]+(?:/[a-zA-Z\d]+)+)", "(?:[[A-Z\d]+(?:[-][A-Z\d]+)+)"]

暗示。我发现根据需要从更改7-2017-19121-B7/2017/19121/B工作。问题是(让我检查)我怎样才能使它适应我当前的代码并保持我现在的性能。

标签: python-3.xspacy

解决方案


您可以将它们添加为“特殊情况”

nlp.tokenizer.add_special_case("7-2017-19121-B", [{ORTH: "7-2017-19121-B"}])
...
nlp.tokenizer.add_special_case("H14-0890-12", [{ORTH: "H14-0890-12"}])

测试:

print([w.text for w in nlp("Got JLG486-01 and 7-2017-19121-B codes.")]) 
# => ['Got', 'JLG486-01', 'and', '7-2017-19121-B', 'codes', '.']

推荐阅读