2017-11-20 1 views
0

Sie haben versucht, mit SpaCy so etwas wie '$ 125.00/share' zu erreichen, indem Sie das hier beschriebene regelbasierte Matching verwenden, wie hier erwähnt https://github.com/explosion/spaCy/issues/882. Wenn jedochspaCy 'IS_SPACE' -Flagge funktioniert nicht

Ausprobieren
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) 

ich zurück,

('angepasst', $ 125/Aktie)
('Matched!', $ 125. 00/Aktie)

Stattdessen möchte ich Muster wie "125,00 $/Aktie" ohne die Leerzeichen dazwischen abgleichen. Beim Versuch,

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'}] 

Mein Ausdruck stimmt mit keinem Muster überein. Bitte, hilf!

Antwort

0

Das Problem hierbei ist, dass jedes Wörterbuch in dem Übereinstimmungsmuster ein tatsächlichen beschreibt, bestehende Token - so wird {'IS_SPACE': False} jeder Token übereinstimmen, die kein Leerzeichen (zum Beispiel ein Token mit dem Text „Hund“ oder " 123 "oder irgendetwas, wirklich). Es gibt keine Möglichkeit für den Matcher, auf die Abwesenheit eines Tokens zu passen.

Ich habe gerade Ihr Beispiel versucht und standardmäßig Spacys Tokenizer spaltet "$ 125,00/share" in nur zwei Token: ['$', '125.00/share']. Wenn der Matcher durch die Token schreitet, wird er nicht übereinstimmen, da er nach einem Währungssymbol + einem Nicht-Leerzeichen-Zeichen + einer Ziffer + einer Menge anderer Tokens sucht.

Um also auf spezifischere Teile des Tokens "125,00/share" zu passen - wie die Zahl, den Schrägstrich und "share" - müssen Sie sicherstellen, dass spacy diese in separate Token aufteilt. Sie können dies tun, indem Sie customising the tokenization rules hinzufügen und eine neue Infix-Regel hinzufügen, die Tokens auf / Zeichen aufteilt. Dies führt zu "$ 125,00/share" → ['$', '125.00', '/', 'share'], die von Ihrem Muster angepasst werden.

Btw, einige Hintergrund auf Whitespace-Token: Während Tokenisierung teilt SpaCy Tokens auf einzelne Leerzeichen Zeichen. Diese Zeichen sind nicht als einzelne Tokens verfügbar (aber um sicherzustellen, dass keine Informationen verloren gehen, können sie über das Attribut .text_with_ws_ erreicht werden). Wenn jedoch mehr als ein Whitespace-Zeichen vorhanden ist, behält SpaCy diese als Token bei, die True für IS_SPACE zurückgeben. Alle anderen Token geben False für IS_SPACE zurück.