2016-06-30 8 views
5

Ich verwende die CountVectorizer und möchte nicht getrennte Wörter in verschiedene Token trennen. Ich habe versucht, verschiedene Pregex-Muster in das token_pattern Argument zu übergeben, aber war nicht in der Lage, das gewünschte Ergebnis zu erhalten.scikit-learn: Trenne nicht getrennte Wörter während der Tokenisierung

Hier ist, was ich versucht habe:

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 & percentages 
| \.\.\.   # ellipses ''' 

text = 'I hate traffic-ridden streets.' 
vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern) 
analyze = vectorizer.build_analyzer() 
analyze(text) 

Ich habe auch nltk ‚versuchte s zu verwenden regexp_tokenize wie in einer früheren Frage vorgeschlagen, aber es ist das Verhalten als auch geändert zu haben scheint.

+0

Mögliche Duplikat http://stackoverflow.com/questions/25355046/using-nltk-regex-example-in-scikit-learn -counvectorizer –

+1

@AbhinavArora Ich habe mir diese Lösung bereits angesehen. Die Lösung funktioniert nicht mit der neuesten Version von NLTK, d. H. 3.0.2 –

+0

, wenn Sie andere als Regex verwenden können. Dies kann mit Rechen erreicht werden. – vinod

Antwort

6

Es gibt ein paar Dinge zu beachten. Die erste besteht darin, dass das Hinzufügen all dieser Leerzeichen, Zeilenumbrüche und Kommentare in die Musterzeichenfolge alle diese Zeichen zu einem regulären Ausdruck macht. Siehe hier:

import re 
>>> re.match("[0-9]","3") 
<_sre.SRE_Match object at 0x104caa920> 
>>> re.match("[0-9] #a","3") 
>>> re.match("[0-9] #a","3 #a") 
<_sre.SRE_Match object at 0x104caa718> 

Die zweite ist, dass Sie spezielle Sequenzen entkommen müssen, wenn Sie Ihr Regex-Muster in einer Zeichenfolge erstellen. Zum Beispiel pattern = "\w" muss wirklich pattern = "\\w" sein. Sobald Sie für diese Dinge verantwortlich sind, sollten Sie in der Lage sein, die Regex für Ihren gewünschten Tokenizer zu schreiben. Zum Beispiel, wenn Sie wollte nur so etwas wie dies in Bindestriche hinzuzufügen funktioniert:

>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> pattern = "(?u)\\b[\\w-]+\\b" 
>>> 
>>> text = 'I hate traffic-ridden streets.' 
>>> vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern) 
>>> analyze = vectorizer.build_analyzer() 
>>> analyze(text) 
[u'hate', u'traffic-ridden', u'streets'] 
+0

Super, danke! Diese einfache Änderung löste (verhinderte) die Trennung von Bindestrichen (zB miR-200): cv = CountVectorizer (token_muster = '(? U) \\ b [\\ w -] + \\ b', analyzer = 'word ') –

Verwandte Themen