2016-07-10 3 views
1

Ich muss eine Textdatei in eine bestimmte Anzahl von Wörtern pro Liste in der Liste aufteilen, wahrscheinlich am besten in Beispiel zu zeigen.Split-Liste von Text in nGrams in Python

sagen, dass die Textdatei wie diese i eine Funktion schreiben müssen

"i am having a good day today" 

sieht das wie dieses

ngrams.makeNGrams("ngrams.txt", 2) 
#so since the given variable says 2 the output should look like this: 

[['i', 'am'],['am', 'having'],['having', 'a'],['a',’good’],[’good’, ’day’],[’day’,’today’]] 

, wenn die Funktion sah aus wie dieses

ngrams.makeNGrams("ngrams.txt", 3) 

#it should give out: 

[[’i’,’am’,’having’],[’having’,’a’,’good’],[’good’,’day’,’today’]] 

niemanden sieht wie soll ich jetzt am besten damit umgehen? vielen Dank im Voraus

+1

Stack Overflow ist kein Code-Schreibdienst, und das sieht nach Hausaufgaben aus. Zeig uns, was du ausprobiert hast: Siehe [Fragen über Hausaufgaben] (http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions) für weitere Informationen – TemporalWolf

Antwort

0

definieren:

def ngrams(text, n): 
    words = text.split() 
    return [ words[i:i+n] for i in range(len(words)-n+1) ] 

und Verwendung:

s = "i am having a good day today" 
ngrams(s, 2) 
+1

Großartig Danke – gbZDB

0

Ich bin sicher, es ist ein pythonic Weg, dies zu tun. Es ist keine Funktion (aber es sollte leicht anzupassen sein), sondern ein Programm. Ich denke, es folgt Ihre Spezifikation:

import sys 

num = int(sys.argv[1]) 

cad = "i am having a good day today" 

listCad = cad.split(" ") 

listOfLists = [] 
i = 0 
while i <= len(listCad) - num: 
    listOfLists.append(listCad[i:i+num]) 
    i = i + (num - 1) 

print listOfLists 
1

Ich würde es tun, wie folgt:

def ngrams(words, n): 
    return zip(*(words[i:] for i in range(n))) 

Verbrauch:

>>> words = "i am having a good day today".split() 
>>> list(ngrams(words, 2)) 
[('i', 'am'), ('am', 'having'), ('having', 'a'), ('a', 'good'), ('good', 'day'), ('day', 'today')] 
>>> list(ngrams(words, 3)) 
[('i', 'am', 'having'), ('am', 'having', 'a'), ('having', 'a', 'good'), ('a', 'good', 'day'), ('good', 'day', 'today')] 

Die Idee ist n Listen aus der ursprünglichen Liste zu erzeugen, mit i-te Liste verschoben durch i. Dann einfach zip diese verschobenen Listen zusammen und geben das Ergebnis zurück.

Visualisierung für n=3:

['i',  'am',  'having', 'a', 'good', 'day', 'today'] # not shifted 
['am',  'having', 'a',  'good', 'day', 'today']   # shifted by 1 
['having', 'a',  'good', 'day', 'today']     # shifted by 2 

Die zip Funktion näht das Element an dem gleichen Indizes zusammen, bis die kürzesten von Listen erschöpft ist, um die gewünschte Ausgabe zu erzeugen.

+0

Ich bekomme TypeError: Typ Objekt Argument nach * muss eine Sequenz sein, nicht Generator – gbZDB

+0

Verwenden Sie Python3? Edit - mit Python2.7 und Python3.5 versucht und es funktioniert - Ich habe die Antwort bearbeitet, um das Ergebnis in eine Liste umgewandelt, so dass es in beiden gleich verhält. – plamut

+0

ja, Python 3.4 Ich übersprungen mit den Daten und verwendet eine Zeichenfolge als ein Objekt, genau wie du, aber ich habe gbZDB

Verwandte Themen