python - SpaCy 括号标记化:(LRB,RRB)对未正确标记
问题描述
当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')]
这是一个错误吗?有什么建议可以解决这个问题吗?
解决方案
使用自定义标记器将r'\b\)\b'
规则(请参阅此正则表达式演示)添加到infixes
. 正则表达式匹配)
前面有任何单词 char (字母、数字、_
和 Python 3 中的一些其他稀有字符)并后跟这种类型的 char 的 a。
您可以进一步自定义此正则表达式,因此很大程度上取决于您要匹配的上下文)
。
查看完整的 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')]
推荐阅读
- php - PHP mail() 函数返回 1,但尽管配置了 XAMPP,但没有发送邮件
- laravel - 我总是有同一个学生出现在每次录音之后
- javascript - 从打字稿转译时的NodeJS导入问题
- python - 将列表的元素附加到 dict
- html - 如何将项目符号对齐到中间
- 标签?
- r - ANOVA 自由度不正确
- amazon-web-services - 定期从 AWS S3 读取并发布到 SQS
- java - IntelliJ IDEA 2019 + lombok + LibGDX。如何使用 gradle runner 修复失败的应用程序构建
- python-3.x - 散列 pandas Dataframe 列中字符串列表的每个元素
- javascript - 使用纯 JavaScript 从 Firestore 接收数据