为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 python spacy matcher 匹配 (0)20 111 2222

如何使用 python spacy matcher 匹配 (0)20 111 2222

qq_笑_17 2023-08-08 17:48:33
我正在尝试以下模式:pattern = [ {'ORTH': '('}, {'SHAPE': 'd'},            {'ORTH': ')'},            {'SHAPE': 'dd'},            {'ORTH': '-', 'OP': '?'},            {'SHAPE': 'ddd'},            {'ORTH': '-', 'OP': '?'},            {'SHAPE': 'dddd'}]matcher.add('PHONE_NUMBER_E', None, pattern)如果我在括号后的电话号码中添加空格(例如 (0) 20 111 2222),则此方法有效,但其他情况则无效。我才刚刚开始使用 python,所以我确信我错过了一些简单的东西。感谢您的帮助。
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

使用 spacy 匹配与使用正则表达式匹配字符串的问题在于,使用 spacy 你[几乎]永远不会提前知道分词器会对你的字符串做什么:


有空间:


doc = nlp("This is my telephone number (0) 20 111 2222")

[tok.text for tok in doc]

['This', 'is', 'my', 'telephone', 'number', '(', '0', ')', '20', '111', '2222']

没有空格:


doc = nlp("This is my telephone number (0)20 111 2222")

[tok.text for tok in doc]

['This', 'is', 'my', 'telephone', 'number', '(', '0)20', '111', '2222']

考虑到这一点,您可以编写 2 个模式来获取两种格式:


doc = nlp("My telephone number is either (0)20 111 2222 or (0) 20 111 2222")

matcher = Matcher(nlp.vocab, validate=True)

pattern1 = [ {'ORTH': '('}, {'SHAPE': 'd'},

            {'ORTH': ')'},

            {'SHAPE': 'dd'},

            {'ORTH': '-', 'OP': '?'},

            {'SHAPE': 'ddd'},

            {'ORTH': '-', 'OP': '?'},

            {'SHAPE': 'dddd'}]


pattern2 = [ {'ORTH': '('},

            {'TEXT':{'REGEX':'[\d]\)[\d]*'}},

            {'ORTH': '-', 'OP': '?'},

            {'SHAPE': 'ddd'},

            {'ORTH': '-', 'OP': '?'},

            {'SHAPE': 'dddd'}]

matcher.add('PHONE_NUMBER_E', None, pattern1, pattern2)

matches = matcher(doc)

for match_id, start, end in matches:

    string_id = nlp.vocab.strings[match_id]

    span = doc[start:end] 

    print(span)

(0)20 111 2222

(0) 20 111 2222


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信