spaCy'IS_SPACE'标志不起作用

时间:2017-11-20 17:16:50

标签: spacy

尝试使用像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'}]

我的表情与任何模式都不匹配。请帮助!

1 个答案:

答案 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>