Spacy Matcher 日期模式将匹配连字符,但不匹配正斜杠?
Spacy Matcher date pattern will match hyphens, but not forward slashes?
我找不到 pattern_2
在下面的代码中起作用的任何原因,但 pattern_1
却不起作用。为什么匹配器能够找到带有连字符的日期模式,而不是带有正斜杠的日期模式?
import spacy
from spacy.tokens.doc import Doc
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
doc: Doc = nlp('4/15/2021 4-15-2021')
pattern_1 = [{'IS_DIGIT': True}, {'ORTH': '/'}, {'IS_DIGIT': True}, {'ORTH': '/'}, {'IS_DIGIT': True}]
pattern_2 = [{'IS_DIGIT': True}, {'ORTH': '-'}, {'IS_DIGIT': True}, {'ORTH': '-'}, {'IS_DIGIT': True}]
matcher.add('DATE_PATTERN_1', None, pattern_1)
matcher.add('DATE_PATTERN_2', None, pattern_2)
matches = matcher(doc)
print(f"matches = {matches}")
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
输出:
matches = [(93485516188963487, 1, 6)]
4-15-2021
第一个 4/15/2021
被解析为单个标记:
print([t for t in doc])
# => [4/15/2021, 4, -, 15, -, 2021]
您可以使用基于正则表达式的模式来检测这种标记:
pattern_1 = [{'TEXT':{'REGEX':r'^\d{1,2}/\d{1,2}/\d{2}(?:\d{2})?$'}}]
那么,结果会是这样的
print(f"matches = {matches}")
# => matches = [(2279607876847626059, 0, 1), (93485516188963487, 1, 6)]
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
# => 4/15/2021
# 4-15-2021
正则表达式匹配
^
- 字符串开头
\d{1,2}
- 一位或两位数
/
- 一个 /
字符
\d{1,2}/\d{2}
- 一位或两位数,/
,两位数
(?:\d{2})?
- 可选的两位数字序列
$
- 字符串结尾(此处为标记)。
我找不到 pattern_2
在下面的代码中起作用的任何原因,但 pattern_1
却不起作用。为什么匹配器能够找到带有连字符的日期模式,而不是带有正斜杠的日期模式?
import spacy
from spacy.tokens.doc import Doc
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_sm')
matcher = Matcher(nlp.vocab)
doc: Doc = nlp('4/15/2021 4-15-2021')
pattern_1 = [{'IS_DIGIT': True}, {'ORTH': '/'}, {'IS_DIGIT': True}, {'ORTH': '/'}, {'IS_DIGIT': True}]
pattern_2 = [{'IS_DIGIT': True}, {'ORTH': '-'}, {'IS_DIGIT': True}, {'ORTH': '-'}, {'IS_DIGIT': True}]
matcher.add('DATE_PATTERN_1', None, pattern_1)
matcher.add('DATE_PATTERN_2', None, pattern_2)
matches = matcher(doc)
print(f"matches = {matches}")
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
输出:
matches = [(93485516188963487, 1, 6)]
4-15-2021
第一个 4/15/2021
被解析为单个标记:
print([t for t in doc])
# => [4/15/2021, 4, -, 15, -, 2021]
您可以使用基于正则表达式的模式来检测这种标记:
pattern_1 = [{'TEXT':{'REGEX':r'^\d{1,2}/\d{1,2}/\d{2}(?:\d{2})?$'}}]
那么,结果会是这样的
print(f"matches = {matches}")
# => matches = [(2279607876847626059, 0, 1), (93485516188963487, 1, 6)]
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.text)
# => 4/15/2021
# 4-15-2021
正则表达式匹配
^
- 字符串开头\d{1,2}
- 一位或两位数/
- 一个/
字符\d{1,2}/\d{2}
- 一位或两位数,/
,两位数(?:\d{2})?
- 可选的两位数字序列$
- 字符串结尾(此处为标记)。