2016-04-01 21 views
2

Ich habe versucht, einen regulären Ausdruck tokenizer mit nltk in Python zu implementieren, aber das Ergebnis ist folgendes:nltk regulären Ausdruck tokenizer

>>> import nltk 
>>> text = 'That U.S.A. poster-print costs $12.40...' 
>>> pattern = r'''(?x) # set flag to allow verbose regexps 
...  ([A-Z]\.)+  # abbreviations, e.g. U.S.A. 
... | \w+(-\w+)*  # words with optional internal hyphens 
... | \$?\d+(\.\d+)?%? # currency and percentages, e.g. $12.40, 82% 
... | \.\.\.   # ellipsis 
... | [][.,;"'?():-_`] # these are separate tokens; includes ], [ 
... ''' 
>>> nltk.regexp_tokenize(text, pattern) 
[('', '', ''), ('', '', ''), ('', '-print', ''), ('', '', ''), ('', '', '')] 

Aber das gewünschte Ergebnis ist folgendes:

['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...'] 

Warum? Wo ist der Fehler?

+0

Try 'von nltk.tokenize Import RegexpTokenizer',' tokenizer = RegexpTokenizer (Muster) 'und dann' tokenizer.tokenize (Text) ' –

+0

Es kehrt zurück '[ 'Das' "USA", "Posterdruck", "Kosten", "$ 12.40", "..."] in meinem Notizbuch. Vielleicht ein Versions-Problem? (3.0.4) – ayhan

+0

Ich habe versucht mit Python 3.5 aber das Ergebnis ist das noch: [('', '', ''), ('', '', ''), ('', '-print' , '', ('', '', ''), ('', '', '')] –

Antwort

6

Sie sollten alle einfangenden Gruppen zu nicht-Capturing drehen:

  • ([A-Z]\.)+>(?:[A-Z]\.)+
  • \w+(-\w+)* ->\w+(?:-\w+)*
  • \$?\d+(\.\d+)?%? zu \$?\d+(?:\.\d+)?%?

Das Problem ist, dass regexp_tokenize scheint Verwenden Sie re.findall, die ca Tupel-Listen, wenn mehrere Capture-Gruppen im Muster definiert sind. Siehe this nltk.tokenize package reference:

pattern (str) - Das Muster verwendet, um diesen tokenizer zu bauen. (muß Dieses Muster enthält keine Klammern erfassen; Verwenden nicht-einfangenden Klammern, zB (...), stattdessen?)

Auch ich bin nicht sicher, ob Sie verwenden :-_ wollten, dass ein Treffer Bereich einschließlich aller Großbuchstaben, setzen Sie die - an das Ende der Zeichenklasse.

So verwenden

pattern = r'''(?x)   # set flag to allow verbose regexps 
     (?:[A-Z]\.)+  # abbreviations, e.g. U.S.A. 
     | \w+(?:-\w+)*  # words with optional internal hyphens 
     | \$?\d+(?:\.\d+)?%? # currency and percentages, e.g. $12.40, 82% 
     | \.\.\.    # ellipsis 
     | [][.,;"'?():_`-] # these are separate tokens; includes ], [ 
    '''