2017-01-27 7 views
4

Ich versuche, die Sätze in Worte zu teilen.Aufteilen der Sätze in Python

words = content.lower().split() 

das gibt mir die Liste der Wörter wie

'evening,', 'and', 'there', 'was', 'morning--the', 'first', 'day.' 

und mit diesem Code:

def clean_up_list(word_list): 
    clean_word_list = [] 
    for word in word_list: 
     symbols = "[email protected]#$%^&*()_+`{}|\"?><`-=\][';/.,']" 
     for i in range(0, len(symbols)): 
      word = word.replace(symbols[i], "") 
     if len(word) > 0: 
      clean_word_list.append(word) 

ich so etwas wie:

'evening', 'and', 'there', 'was', 'morningthe', 'first', 'day' 

, wenn Sie das sehen Wort "morningthe" in der Liste, es verwendet "-" zwischen Wörtern haben. Nun, gibt es einen Weg, wie ich sie in zwei Wörter wie "morning","the" teilen kann?

+0

Sie müssen auf allen Separatoren spalten, nicht nur weiß-Raum. Dies wird in anderen StackOverflow-Fragen behandelt. – Prune

+0

möglich duplizieren von http://StackOverflow.com/q/13209288/3865495 – CoconutBandit

+1

Sie müssen 'strip()' Methode verwenden, um unerwünschte Symbole an den Enden der Zeile zu löschen. I.e. ''x -'. strip (',: -')' -> ''x'', aber'' x-y'.strip (',: -') '->' 'x-y''. Wenn Sie jedoch mit echten Texten arbeiten wollen, brauchen Sie einen komplexeren Ansatz ... Vielleicht sollte NTLK ein guter Anfang sein? – myaut

Antwort

3

Ich würde eine Regex-basierte Lösung vorschlagen:

import re 

def to_words(text): 
    return re.findall(r'\w+', text) 

Diese für alle Wörter sieht - Gruppen von Buchstaben, Symbole, seperators und Leerzeichen ignoriert.

>>> to_words("The morning-the evening") 
['The', 'morning', 'the', 'evening'] 

Beachten Sie, dass, wenn Sie über die Worte sind Looping, re.finditer verwendet, die einen Generator Objekt zurückgibt, ist wahrscheinlich besser, als Sie auf einmal haben Speicher die ganze Liste von Wörtern nicht.

3

Alternativ können Sie auch itertools.groupby zusammen mit str.alpha() verwenden Alphabete-nur Worte aus dem String zu extrahieren:

>>> from itertools import groupby 
>>> sentence = 'evening, and there was morning--the first day.' 

>>> [''.join(j) for i, j in groupby(sentence, str.isalpha) if i] 
['evening', 'and', 'there', 'was', 'morning', 'the', 'first', 'day'] 

PS: Regex-basierte Lösung ist viel sauberer. Ich habe dies als eine mögliche Alternative erwähnt, um dies zu erreichen.


Spezifisch für OP: Wenn alles, was Sie wollen auch auf -- in der resultierenden Liste verteilen ist, dann können Sie zunächst Bindestriche '-' mit Platz ersetzen ' ' vor Split durchführen. Daher sollten Sie den Code sein:

words = content.lower().replace('-', ' ').split() 

wo words hält den Wert, den Sie sich wünschen.

1

Der Versuch, dies mit Regexes zu tun, wird Sie verrückt machen, z.

>>> re.findall(r'\w+', "Don't read O'Rourke's books!") 
['Don', 't', 'read', 'O', 'Rourke', 's', 'books'] 

Schauen Sie sich unbedingt das Paket nltk an.

0

Neben den bereits angegebenen Lösungen könnten Sie auch Ihre Funktion verbessern, um eine bessere Arbeit zu leisten.

def clean_up_list(word_list): 
    clean_word_list = [] 
    # Move the list out of loop so that it doesn't 
    # have to be initiated every time. 
    symbols = "[email protected]#$%^&*()_+`{}|\"?><`-=\][';/.,']" 

    for word in word_list: 
     current_word = '' 
     for index in range(len(word)): 
      if word[index] in symbols: 
       if current_word: 
        clean_word_list.append(current_word) 
        current_word = '' 
      else: 
       current_word += word[index] 

     if current_word: 
      # Append possible last current_word 
      clean_word_list.append(current_word) 

    return clean_word_list 

Eigentlich könnten Sie den Block in for word in word_list: auf den gesamten Satz gelten das gleiche Ergebnis zu erhalten.

0

Sie könnten auch dies tun:

import re 

def word_list(text): 
    return list(filter(None, re.split('\W+', text))) 

print(word_list("Here we go round the mulberry-bush! And even---this and!!!this.")) 

Returns:

['Here', 'we', 'go', 'round', 'the', 'mulberry', 'bush', 'And', 'even', 'this', 'and', 'this'] 
Verwandte Themen