2015-08-24 13 views
8
import nltk 
>>> nltk.__version__ 
'3.0.4' 
>>> nltk.word_tokenize('"') 
['``'] 
>>> nltk.word_tokenize('""') 
['``', '``'] 
>>> nltk.word_tokenize('"A"') 
['``', 'A', "''"] 

Sehen Sie, wie es " zu einem Doppelwechsel `` und ''?NLTK Wort tokenize Verhalten für doppelte Anführungszeichen ist verwirrend

Was passiert hier? Warum verändert es den Charakter? Gibt es eine Lösung? Da ich später nach jedem Token in der Zeichenfolge suchen muss.

Python 2.7.6 wenn es einen Unterschied macht.

+0

Es ermöglicht, die Fehler zu vermeiden (wie man richtig "' '?)? Wenn Sie es ändern möchten, können Sie [die Quelle] aktualisieren (http://www.nltk.org/_modules/nltk/tokenize/punkt .html # PunktLanguageVars.word_tokenize) Aber du kannst auch die falschen Zeichen in deiner Token-Liste ersetzen ... – clemtoy

Antwort

9

TL; DR:

nltk.word_tokenize Änderungen doppelte Anführungszeichen Änderungen von " -> `` beginnen und doppelte Anführungszeichen aus " -> '' endet.


In langen:

Zuerst wird die nltk.word_tokenize tokenizes Basis auf, wie Penn Treebank Token versehen wurde, ist es aus nltk.tokenize.treebank kommt, siehe https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init.py#L91 und https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L23

class TreebankWordTokenizer(TokenizerI): 
    """ 
    The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank. 
    This is the method that is invoked by ``word_tokenize()``. It assumes that the 
    text has already been segmented into sentences, e.g. using ``sent_tokenize()``. 

dann eine Liste von regex kommt Ersatz für Kontraktionen bei https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L48, kommt es aus der "Robert MacIntyres Tokenizer“, also https://www.cis.upenn.edu/~treebank/tokenizer.sed

Die Kontraktionen spaltet Wörter wie "Gonna", "wollen", etc .:

>>> from nltk import word_tokenize 
>>> word_tokenize("I wanna go home") 
['I', 'wan', 'na', 'go', 'home'] 
>>> word_tokenize("I gonna go home") 
['I', 'gon', 'na', 'go', 'home'] 

Danach haben wir die Zeichensetzung Teil erreichen, die Sie zu fragen sind, sehen https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L63:

def tokenize(self, text): 
    #starting quotes 
    text = re.sub(r'^\"', r'``', text) 
    text = re.sub(r'(``)', r' \1 ', text) 
    text = re.sub(r'([ (\[{<])"', r'\1 `` ', text) 

Ah ha, ab zitiert Änderungen von „->` `:

>>> import re 
>>> text = '"A"' 
>>> re.sub(r'^\"', r'``', text) 
'``A"' 
KeyboardInterrupt 
>>> re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text)) 
' `` A"' 
>>> re.sub(r'([ (\[{<])"', r'\1 `` ', re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text))) 
' `` A"' 
>>> text_after_startquote_changes = re.sub(r'([ (\[{<])"', r'\1 `` ', re.sub(r'(``)', r' \1 ', re.sub(r'^\"', r'``', text))) 
>>> text_after_startquote_changes 
' `` A"' 

Dann sehen wir https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L85, die mit der Endung Anführungszeichen Angebote:

#ending quotes 
    text = re.sub(r'"', " '' ", text) 
    text = re.sub(r'(\S)(\'\')', r'\1 \2 ', text) 

Anwenden der Regexes:

>>> re.sub(r'"', " '' ", text_after_startquote_changes) 
" `` A '' " 
>>> re.sub(r'(\S)(\'\')', r'\1 \2 ', re.sub(r'"', " '' ", text_after_startquote_changes)) 
" `` A '' " 

Also, wenn Sie die Liste der Tokens für doppelte Anführungszeichen nach nltk.word_tokenize suchen möchten Suchen Sie einfach nach `` und '' anstelle von ".

+0

Danke das macht Sinn. – Motasim

Verwandte Themen