尝试使用像https://github.com/explosion/spaCy/issues/882这样提到的基于规则的匹配来匹配spaCy上的'$ 125.00 / share'。但是,在试用时
nlp = en_core_web_sm.load()
matcher = Matcher(nlp.vocab)
doc = nlp(u'$125.00/share, $ 125 / share, $ 125.00 / share, $ 125 . 00 / share')
token_pattern = [{'NORM': '$'}, {'IS_DIGIT': True}, {'ORTH': '.', 'OP': '?'},
{'IS_DIGIT': True, 'OP': '?'}, {'ORTH': '/'}, {'LOWER': 'share'}]
def matched_pattern (matcher, doc, i, matches):
match_id, start, end = matches[i]
span = doc[start: end]
print ('matched!', span)
matcher.add('SharePrice', matched_pattern, token_pattern)
matches = matcher(doc)
我回来了,
('匹配!',每股125美元) (“匹配!”,125美元/股)
相反,我希望匹配'$ 125.00 / share'之类的模式,而不是两者之间的空格。在尝试时,
token_pattern = [{'NORM': '$'}, {'IS_SPACE': False}, {'IS_DIGIT': True}, {'IS_SPACE': False},{'ORTH': '.', 'OP': '?'}, {'IS_SPACE': False},
{'IS_DIGIT': True, 'OP': '?'}, {'IS_SPACE': False}, {'ORTH': '/'}, {'IS_SPACE': False}, {'LOWER': 'share'}]
我的表情与任何模式都不匹配。请帮助!
答案 0 :(得分:0)
这里的问题是匹配模式中的每个字典都描述了一个实际的现有标记 - 所以{'IS_SPACE': False}
将匹配任何不是空白字符的标记(例如,一个标记)文字“狗”或“123”或任何东西,真的)。匹配器无法匹配缺少令牌。
我刚试过你的例子,默认情况下,spaCy的标记器只将“$ 125.00 / share”分成两个标记:['$', '125.00/share']
。当匹配器逐步通过令牌时,它将无法匹配,因为它正在寻找货币符号+非空格字符+数字+一堆其他令牌。
因此,为了匹配令牌“125.00 / share”的更具体部分 - 比如数字,正斜杠和“分享” - 你必须确保spaCy将它们分成单独的标记。您可以customising the tokenization rules执行此操作,并添加一个新的中缀规则,用于在/
个字符上拆分令牌。这将导致“$ 125.00 /份”→['$', '125.00', '/', 'share']
,这将与您的模式匹配。
顺便说一下,有关空白令牌的一些背景知识:在标记化过程中,spaCy会在单个空格字符上拆分标记。这些字符不能作为单独的标记使用(但为了确保不丢失任何信息,可以通过.text_with_ws_
属性访问它们)。但是,如果存在多个空白字符,spaCy会将这些字符保留为令牌,这将为True
返回IS_SPACE
。所有其他令牌将返回False
IS_SPACE
。{/ p>