SpaCy括号标记化:(LRB,RRB)对未正确标记化

发布于 2021-01-29 16:17:50

如果RRB后面的单词没有用空格隔开,则它将被识别为单词的一部分。

In [34]: nlp("Indonesia (CNN)AirAsia ")                                                               
Out[34]: Indonesia (CNN)AirAsia

In [35]: d=nlp("Indonesia (CNN)AirAsia ")

In [36]: [(t.text, t.lemma_, t.pos_, t.tag_) for t in d]                                              
Out[36]: 
[('Indonesia', 'Indonesia', 'PROPN', 'NNP'),
 ('(', '(', 'PUNCT', '-LRB-'),
 ('CNN)AirAsia', 'CNN)AirAsia', 'PROPN', 'NNP')]

In [39]: d=nlp("(CNN)Police")

In [40]: [(t.text, t.lemma_, t.pos_, t.tag_) for t in d]                                              
Out[40]: [('(', '(', 'PUNCT', '-LRB-'), ('CNN)Police', 'cnn)police', 'VERB', 'VB')]

预期结果是

In [37]: d=nlp("(CNN) Police")

In [38]: [(t.text, t.lemma_, t.pos_, t.tag_) for t in d]                                              
Out[38]: 
[('(', '(', 'PUNCT', '-LRB-'),
 ('CNN', 'CNN', 'PROPN', 'NNP'),
 (')', ')', 'PUNCT', '-RRB-'),
 ('Police', 'Police', 'NOUN', 'NNS')]

这是一个错误吗?有解决此问题的建议吗?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用自定义标记器将r'\b\)\b'规则(请参见此regex演示)添加到中infixes。regex与a匹配,该a)之前带有任何单词char(字母,数字,_和Python
    3中的其他稀有字符),并带有此类型的char。

    您可以进一步自定义此正则表达式,因此很大程度上取决于您要与之匹配的上下文)

    查看完整的Python演示:

    import spacy
    import re
    from spacy.tokenizer import Tokenizer
    from spacy.util import compile_prefix_regex, compile_infix_regex, compile_suffix_regex
    
    nlp = spacy.load('en_core_web_sm')
    
    def custom_tokenizer(nlp):
        infixes = tuple([r"\b\)\b"]) +  nlp.Defaults.infixes
        infix_re = spacy.util.compile_infix_regex(infixes)
        prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
        suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)
    
        return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
                                    suffix_search=suffix_re.search,
                                    infix_finditer=infix_re.finditer,
                                    token_match=nlp.tokenizer.token_match,
                                    rules=nlp.Defaults.tokenizer_exceptions)
    
    nlp.tokenizer = custom_tokenizer(nlp)
    doc = nlp("Indonesia (CNN)AirAsia ")
    
    print([(t.text, t.lemma_, t.pos_, t.tag_) for t in doc] )
    

    输出:

    [('Indonesia', 'Indonesia', 'PROPN', 'NNP'), ('(', '(', 'PUNCT', '-LRB-'), ('CNN', 'CNN', 'PROPN', 'NNP'), (')', ')', 'PUNCT', '-RRB-'), ('AirAsia', 'AirAsia', 'PROPN', 'NNP')]
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看