2016-08-02 16 views
5

Ich habe eine Liste von Zeichenfolgen. Wenn eine Zeichenkette das '#' Zeichen enthält, dann möchte ich den ersten Teil der Zeichenkette extrahieren und die Häufigkeitszählung von Wort-Token nur von diesem Teil der Zeichenkette erhalten. dh, wenn die Zeichenfolge „erste Frage # auf Stackoverflow“ ist erwartete Token sind „erster“, „Frage“Scikit Learn - Extrahieren Sie Wort-Token aus einem Zeichenfolgebegrenzer mit CountVectorizer

Wenn die Zeichenfolge nicht enthalten ‚#‘ dann wieder Token des gesamten Zeichenfolge .

Um den Begriff Dokumentenmatrix zu berechnen verwende ich CountVectorizer von scikit.

unter meinem Code finden:

class MyTokenizer(object): 
    def __call__(self,s): 
     if(s.find('#')==-1): 
      return s 
     else: 
      return s.split('#')[0] 
    def FindKmeans(): 
     text = ["first ques # on stackoverflow", "please help"] 
     vec = CountVectorizer(tokenizer=MyTokenizer(), analyzer = 'word') 
     pos_vector = vec.fit_transform(text).toarray() 
     print(vec.get_feature_names())` 

output : [u' ', u'a', u'e', u'f', u'h', u'i', u'l', u'p', u'q', u'r', u's', u't', u'u'] 

Expected Output : [u'first', u'ques', u'please', u'help'] 
+0

Möchten Sie das Auftreten von 'first'' ques zählen, wenn die Zeile '' 'im gesamten Dokument enthält oder nur um die Wörter anzuzeigen, die' # 'haben? –

+0

Ich möchte das Auftreten von Token der Teilzeichenfolge zählen, wenn die Zeile # enthält, sowie das Auftreten von Token aus der gesamten Zeichenfolge, wenn sie # –

Antwort

2

Das Problem mit Ihrem tokenizer legt, haben Sie die Zeichenfolge in die Bits geteilt Sie behalten möchten und die Bits, die Sie nicht behalten möchten, aber Sie‘ Ich habe die Zeichenfolge nicht in Wörter aufgeteilt. Versuchen Sie, die tokenizer unter

class MyTokenizer(object): 
    def __call__(self,s): 
     if(s.find('#')==-1): 
      return s.split(' ') 
     else: 
      return s.split('#')[0].split(' ') 
+0

enthält, danke, es hat funktioniert. Ich sehe, anstatt die Zeichenfolge zurückzugeben, ich sollte die Liste der Token zurückgeben, schließlich ist es ein Tokenizer. Aber wenn ich die Zeichenfolge vom benutzerdefinierten Tokenizer zurückgab, wird der String-Tokenisierungsschritt überschrieben. Anstatt also Zeichen zu symbolisieren, sollte es [erste Frage, bitte Hilfe] erzeugt haben. –

2

mit Sie auf Ihrem Separator aufgeteilt könnte (#) höchstens einmal und nehmen Sie den ersten Teil der Spaltung.

from sklearn.feature_extraction.text import CountVectorizer 

def tokenize(text): 
    return([text.split('#', 1)[0].strip()]) 

text = ["first ques # on stackoverflow", "please help"] 

vec = CountVectorizer(tokenizer=tokenize) 
data = vec.fit_transform(text).toarray() 
vocab = vec.get_feature_names() 

required_list = [] 
for word in vocab: 
    required_list.extend(word.split()) 
print(required_list) 

#['first', 'ques', 'please', 'help'] 
0
s.split('#',1)[0] 

# ist Ihr Ergebnis. Sie müssen nicht überprüfen, ob "#" existiert oder nicht.