2016-07-29 28 views
0

Ich habe eine riesige Liste von Textdateien zu Tokenize. Ich habe den folgenden Code, der für einen kleinen Datensatz funktioniert. Ich habe jedoch Probleme, die gleiche Prozedur mit einem großen Dataset zu verwenden. Ich gebe das Beispiel eines kleinen Datensatzes wie folgt.Tokenizing eine große Menge an Text in Python

In [1]: text = [["It works"], ["This is not good"]] 

In [2]: tokens = [(A.lower().replace('.', '').split(' ') for A in L) for L in text] 

In [3]: tokens 
Out [3]: 
[<generator object <genexpr> at 0x7f67c2a703c0>, 
<generator object <genexpr> at 0x7f67c2a70320>] 

In [4]: list_tokens = [tokens[i].next() for i in range(len(tokens))] 
In [5]: list_tokens 
Out [5]: 
[['it', 'works'], ['this', 'is', 'not', 'good']] 

Während alle so gut mit einer kleinen Datenmenge funktioniert, ich begegne Problem bei der Bearbeitung eine riesige Liste von Listen von Zeichenkette (mehr als 1.000.000 Listen von Strings) mit dem gleichen Code. Da ich immer noch die Zeichenfolgen mit dem großen Dataset wie in In [3] in Token zerlegen kann, schlägt es in In [4] fehl (d. H. Im Terminal beendet). Ich vermute, es ist nur, weil der Textkörper zu groß ist.

Ich bin daher hier, um Vorschläge zur Verbesserung der Prozedur zu erhalten, um Listen von Strings in einer Liste zu erhalten, wie ich in In [5].

Mein tatsächlicher Zweck ist jedoch, die Wörter in jeder Liste zu zählen. Zum Beispiel, in dem Beispiel des kleinen Datensatzes oben, werde ich die folgenden Dinge haben.

Wenn ich Generatoren nicht in Listen umwandeln muss, um die gewünschten Ergebnisse (d. H. Wortanzahl) zu erhalten, wäre das auch gut.

Bitte lassen Sie mich wissen, wenn meine Frage unklar ist. Ich würde gerne so gut wie möglich klären. Vielen Dank.

+0

Ich würde eine 'set()' verwenden, um die ursprüngliche Liste aller Wörter in allen Zeichenfolgen zu erstellen, und dann mit einer Zählung durchlaufen, um die Wertetabelle zu generieren. – beroe

+0

Wie viel RAM hat Ihr Computer? Außerdem nehme ich an, dass Ihr Datensatz in einer Datei gespeichert ist, können Sie ihn Satz für Satz laden? Sie werden eine Menge Speicher auf diese Weise speichern – hmicn

Antwort

1

Sie könnten eine set eindeutiger Wörter erstellen, dann Schleife durch und zählen jeweils die von ...

#! /usr/bin/env python 

text = [["It works works"], ["It is not good this"]] 

SplitList = [x[0].split(" ") for x in text] 
FlattenList = sum(SplitList,[]) # "trick" to flatten a list 
UniqueList = list(set(FlattenList)) 
CountMatrix = [[x.count(y) for y in UniqueList] for x in SplitList] 

print UniqueList 
print CountMatrix 

Ausgabe die Gesamt Liste von Wörtern ist, und ihre Zählungen in jeder Kette:

['good', 'this', 'is', 'It', 'not', 'works'] 
[[0, 0, 0, 1, 0, 2], [1, 1, 1, 1, 1, 0]] 
+0

Es tut mir leid. Ich habe nicht gesehen, dass der Text, den du benutzt hast, anders war. Du hast also eigentlich recht. Vielen Dank!! – achimneyswallow

+1

Sicher. Ich habe gerade den Text geändert, um sicherzustellen, dass es mit wiederholten Wörtern funktioniert. – beroe

+0

Als ich Ihren Code mit meinem riesigen Dataset ausprobierte, wird der Prozess im Terminal immer noch beendet. Trotzdem schätze ich Ihre Eingabe. Der Code ist wunderschön. – achimneyswallow

0

Es gibt viele verfügbare Tokenizer, die optimiert sind. Ich würde CountVectorizer in sklearn betrachten, die für das Zählen von Token gebaut wird.

Sie können auch nltk oder textblob verwenden, wenn Sie weitere Optionen wünschen. Letzteres ist meiner Erfahrung nach schneller.

+0

Danke. Ich habe CountVectorizer benutzt. Während ich versuchte, den Rohtext in Zähldaten umzuwandeln, ging mir jedoch der Speicher aus. Hier ist mein Beitrag http://stackoverflow.com/questions/38670059/vectorization-in-sklearn-seems-to-be-very-memory-expensive-why Ich werde Textblob versuchen. Ich kannte diese Option vorher nicht. Danke, dass du mich informiert hast. – achimneyswallow

+0

Versuchen Sie, in 'Gensim' herumzustochern. Dieses Paket wurde geschrieben, um zu vermeiden, viel RAM zu verwenden.Sie können mit auf der Festplatte gespeicherten Dateien arbeiten (anstatt sie in den Speicher zu laden). Ich bin ziemlich sicher, dass "Gensim" einen Tokenizer hat. – Jason