2017-11-20 11 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 'マッチ!'。00 /株)( 'マッチ!'、$ 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

ここでの問題は、マッチパターンの各辞書は、既存の、実際記述することであるトークン - そう{'IS_SPACE': False}は、例えば空白文字(テキスト「犬」や「持つトークンではありません任意のトークンにマッチします123 "または何か、本当に)。マッチャがのトークンがない場合、で一致する方法はありません。

あなたのサンプルを試したところ、デフォルトでspaCyのトークナイザは「$ 125.00/share」を2つのトークン、すなわち['$', '125.00/share']に分割しています。マッチャーがトークンをステップ実行すると、通貨記号+スペース以外の文字+数字+他のトークンを探しているので、一致しません。

トークンのより具体的な部分を一致させるには、数字、スラッシュ、および "共有"のように、spaCyがそれらを別々のトークンに分割する必要があります。これはcustomising the tokenization rulesで行い、トークンを/文字に分割する新しいインフィックスルールを追加することができます。これにより、 "$ 125.00/share"になります→ ['$', '125.00', '/', 'share']、これはあなたのパターンと一致します。

Btw、空白トークンの背景:トークン化中、spaCyは単一の空白文字でトークンを分割します。これらの文字は個別のトークンとして使用できません(ただし、情報が失われないようにするには、.text_with_ws_属性でアクセスできます)。しかし、複数の空白文字が存在する場合、spaCyはこれらをトークンとして保存し、の場合はTrueを返します。他のすべてのトークンはIS_SPACEに対してFalseを返します。

関連する問題