2017-07-11 4 views
1

Ich habe eine Datenbank mit Textdaten und einen kleinen Zähler erstellt, um die Wortzahl von der gesamten Datenbank zu erhalten. Die gebräuchlichsten Wörter sind die üblichen Verdächtigen ('ist', 'und' usw.) und die am wenigsten verbreiteten sind eine Mischung aus Emojis, Dollarwerten, Tippfehlern und so weiter. Ich möchte die Wörter aus dem Text entfernen, damit ich nur die Werte vektorisieren kann, die nicht am häufigsten oder am seltensten sind. Aber die Liste der höchst ungewöhnlich/anomaler Worte sind etwa 600.000 Artikel lang:Beschleunigung der Textreinigung mit vielen Stoppworten

stopwords = [] 

    for key, value in ctr.items(): #ctr is a Counter() object of words in the entire corpus of text and their counts 
     if value < 4: 
      words += 1 
      stopwords.append(key) 

print (len(stopwords)) 
643392 

Das heißt, ein Beispiel für Tokenisieren nur ein Stück Text unter:

start = time.time() 

[word for word in word_tokenize(stemmer.stem(dataframe.text[20])) if word not in stopwords] 

end = time.time() 

print (end - start) 

79.92309927940369 

also mehr als eine Minute für ein einzelnes Stück Text. Es gibt ungefähr 160.000 Artikel zu reinigen und zu vektorisieren.

Gibt es eine Art vektorisierte Funktion zum Entfernen von Stoppwörtern? Die einzigen Möglichkeiten, die ich beim Umgang mit Stoppwörtern gesehen habe, behandeln das Problem iterativ. Bei dieser Geschwindigkeit dauert die Reinigung dieses Textes etwa drei Monate.

Danke wie immer für jede Hilfe.

+1

Dies ist definitiv ein Fall, wo Multi-Threading die Ausführungszeit verbessern könnte. Eine andere Sache wäre, einen MCVE zu haben, um besser sehen zu können, wo Ihr Engpass sein könnte: https://stackoverflow.com/help/mcve – Adonis

+0

Gibt es eine Möglichkeit, einen MCVE bereitzustellen, wenn die Liste der Stoppwörter so groß ist? Ist das ein Szenario, in dem ich einfach einen Dropbox-Link erstellen soll? – snapcrack

+0

Ich bin mir nicht sicher, ob es hilft, aber vielleicht könnte dies die Dinge ein wenig beschleunigen: https://github.com/alvations/earthy/blob/master/FAQ.md#what-else-can-earthy-do – alvas

Antwort

2

Word-Suche sollte in Python nicht so lange dauern. Sie müssen die Stoppwortentfernung nicht vektorisieren, Sie müssen nur Ihren Code reparieren. Sie zeigen Ihren Code nicht, aber die Wahrscheinlichkeit ist, dass stopwords eine enorme Liste ist. Konvertiere es in ein Set und deine Probleme sollten verschwinden.

stopwords = set(stopwords) 

Zweitens wieder zeigen Ihnen nicht vollständigen Code, aber ich bezweifle wirklich, Sie stemmer haben, die eine Mehrwortkette stammen kann. Tokenize zuerst die Zeichenfolge und dann jedes Wort.

+0

Entschuldigung Ich konnte das bis jetzt nicht bekommen. Die Liste ist bereits eine Menge, da sie von Counter() stammt, also ist jedes dieser Wörter eindeutig. das ist die Herausforderung – snapcrack

+0

Es geht nicht um Einzigartigkeit, es geht um Zugriffszeit. Aber vielleicht erstickt dein Stemmer an der Länge der Dokumentlänge, die du ihm gibst, wer weiß. Sie tun etwas falsch, aber Sie zeigen nicht den entscheidenden Code, damit niemand Ihnen helfen kann. – alexis

+0

Auch wenn Sie 'Counter.keys()' genommen haben, ist es eine Liste. Wo ist dein Code? – alexis

Verwandte Themen