2017-05-24 2 views
2

Pythons Spacy-Paket enthält einen statistischen Tokenizer, der einen Satz intelligent in Token aufteilt. Meine Frage ist, gibt es ein Paket, das mir erlaubt, rückwärts zu gehen, d. H. Von der Liste der Token zu einem schön formatierten Satz? Im Grunde möchte ich eine Funktion, die mir den folgenden Schritte aus läßt:NLP Reverse Tokenizing (von Token zu schön formatierten Satz)

>>> toks = ['hello', ',', 'i', 'ca', "n't", 'feel', 'my', 'feet', '!'] 
>>> some_function(toks) 
"Hello, I can't feel my feet!" 

Es wahrscheinlich irgendeine Art von statistischem/regelbasierten Verfahren muss wissen, wie Abstand, Kapitalisierung oder Kontraktionen sollte in einem richtigen Satz arbeiten.

Antwort

4

In SpaCy können Sie die ursprüngliche Zeichenkette immer mit ''.join(token.text_with_ws for token in doc) rekonstruieren. Wenn Sie nur eine Liste von Strings haben, gibt es nicht wirklich eine gute deterministische Lösung. Sie könnten ein Reverse-Modell trainieren oder einige ungefähre Regeln verwenden. Ich kenne keine gute allgemeine Implementierung dieser detokenize() Funktion.

+0

I Habe Zugang zum spacy-Token-Objekt. Ich erstelle ein Diktat, das die Liste der Token mit dem formatierten Satz übereinstimmt. Vielen Dank! –

2

Sie können nltk in gewissem Maße für die Entschlüsselung wie folgt verwenden. Sie müssen einig Nachbearbeitung tun oder die regulären Ausdrücke ändern, aber hier sind eine Probe Idee:

import re 
from nltk.tokenize.treebank import TreebankWordDetokenizer as Detok 
detokenizer = Detok() 
text = detokenizer.detokenize(tokens) 
text = re.sub('\s*,\s*', ', ', text) 
text = re.sub('\s*\.\s*', '. ', text) 
text = re.sub('\s*\?\s*', '? ', text) 

Es gibt mehr Grenzfälle mit Interpunktion, aber das ist ziemlich einfach und leicht besser als ' '.join