亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號