2017-11-20 7 views
0

https://github.com/explosion/spaCy/issues/882과 같이 규칙 기반 검색을 사용하여 spaCy에서 '$ 125.00/share'와 (과) 일치하는 항목을 찾으려고했습니다.spaCy 'IS_SPACE'플래그가 작동하지 않습니다.

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). 00/주)

대신 '$ 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

문제는 여기에 경기 패턴의 각 사전은 기존의 실제 설명하는 토큰 (Token) - 그래서 {'IS_SPACE': False} 예를 들어 공백 문자 (텍스트 "개"나 "와 토큰이 아닌 모든 토큰을 일치합니다 123 "또는 무엇이든, 정말로). matcher가 에 토큰이없는 경우 일치시킬 수있는 방법이 없습니다.

방금 ​​당신의 예제를 시도했지만 기본적으로 spaCy의 토크 나이저는 "$ 125.00/share"를 두 개의 토큰, 즉 ['$', '125.00/share']으로 나눕니다. 정규 표현식이 토큰을 단계별로 따라갈 때 통화 기호 + 비 공백 문자 + 숫자 + 다른 토큰을 찾고 있으므로 일치하지 않습니다.

토큰 "125.00/share"의 특정 부분을 일치 시키려면 숫자, 슬래시 및 "공유"처럼 spaCy가 토큰을 별도의 토큰으로 분할해야합니다. 이것을 customising the tokenization rules으로하고 / 자에 토큰을 분할하는 새로운 중절 어 규칙을 추가 할 수 있습니다. 그러면 "$ 125.00/share"가 → ['$', '125.00', '/', 'share']이되며 이는 귀하의 패턴과 일치합니다.

Btw, 공백 토큰의 일부 배경 : 토큰 화 중에 spaCy는 단일 공백 ​​문자로 토큰을 분할합니다. 이러한 문자는 개별 토큰으로 사용할 수 없지만 정보가 손실되지 않도록하려면 .text_with_ws_ 속성을 통해 액세스 할 수 있습니다. 그러나 둘 이상의 공백 문자가있는 경우 spaCy는 해당 문자를 토큰으로 유지하므로 에 대해 True을 반환합니다. 다른 모든 토큰은 IS_SPACE에 대해 False을 반환합니다.