2016-04-08 3 views
3

Ich versuche, Spacy NLP (Natural Language Processing) Pipline auf eine große Textdatei wie Wikipedia Dump anwenden. Hier ist mein Code basiert auf documentation Beispiel des Spacy:Multi-Threaded NLP mit spacy Rohr

from spacy.en import English 

input = open("big_file.txt") 
big_text= input.read() 
input.close() 

nlp= English()  

out = nlp.pipe([unicode(big_text, errors='ignore')], n_threads=-1) 
doc = out.next() 

Spacy wendet alle nlp Operationen wie POS-Tagging, Lemmatizing und etc alles auf einmal. Es ist wie eine Pipeline für NLP, die sich in einem Schritt um alles kümmert, was Sie brauchen. Die Anwendung der Pipe-Methode soll den Prozess durch Multithreading der teuren Teile der Pipeline sehr viel schneller machen. Aber ich sehe keine große Geschwindigkeitsverbesserung und meine CPU-Auslastung beträgt etwa 25% (nur einer von vier Kernen arbeitet). Ich habe auch versucht, die Datei in mehreren chuncks zu lesen und die Partie der Eingabetexte erhöhen:

out = nlp.pipe([part1, part2, ..., part4], n_threads=-1) 

aber immer noch die gleiche Leistung. Gibt es trotzdem etwas, um den Prozess zu beschleunigen? Ich vermute, dass die OpenMP-Funktion aktiviert werden sollte, um Spacy zu kompilieren, um die Multi-Threading-Funktion zu verwenden. Aber es gibt keine Anweisungen, wie man es unter Windows macht.

+0

Was macht 'n_threads'? Gibt es einen Grund, warum du es auf weniger als 0 gesetzt hast? –

+0

Es legt die Anzahl der Threads fest, die verwendet werden sollen. Ich denke, -1 bedeutet, dass es automatisch angegeben wird und keine bestimmte Nummer erzwingt –

+0

Haben Sie versucht, eine positive Zahl zu setzen? –

Antwort

4

Ich dachte, was das Problem war. OpenMP ist das Paket, das beim Implementieren von Multithreading für die spacy pipe() -Methode verwendet wird. Diese Option ist standardmäßig für den MSVC-Compiler deaktiviert. Nachdem ich den Quellcode mit der Unterstützung von openmp kompiliert habe, funktioniert es großartig. Ich habe auch eine pull request gemacht, um dies bei den nächsten Releases zu ermöglichen. Für Releases nach 0.100.7 (was die neueste Version ist) sollte Multithreading mit pipe() unter Windows ohne Probleme funktionieren.