Ich suche nach einer Möglichkeit, einen Text in n-Gramm aufzuteilen. Normalerweise würde ich so etwas machen wie:
import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Mir ist bewusst, dass nltk nur Bigramme und Trigramme anbietet. Gibt es jedoch eine Möglichkeit, meinen Text in vier Gramm, fünf Gramm oder sogar hundert Gramm aufzuteilen?
Vielen Dank!
ingrams
deren zweiter Parameter der Grad der gewünschten ngramme ist. Ist DIES die Version von nltk, die Sie verwenden? Selbst wenn nicht, hier ist die Quelle EDIT: Es gibtngrams
undingrams
es in,ingrams
ein Generator zu sein.Antworten:
Tolle native Python-basierte Antworten von anderen Benutzern. Aber hier ist der
nltk
Ansatz (nur für den Fall, dass das OP dafür bestraft wird, dass es das neu erfunden hat, was bereits in dernltk
Bibliothek vorhanden ist).Es gibt ein ngram-Modul , das nur selten verwendet wird
nltk
. Dies liegt nicht daran, dass es schwierig ist, ngramme zu lesen, sondern daran, eine Modellbasis auf ngrams zu trainieren, bei der n> 3 zu einer großen Datenarmut führt.quelle
sixgrams
?Ich bin überrascht, dass dies noch nicht aufgetaucht ist:
quelle
Verwenden Sie nur nltk-Tools
Beispielausgabe
Um die ngramme im Array-Format zu halten, entfernen Sie sie einfach
' '.join
quelle
Hier ist ein weiterer einfacher Weg, um n-Gramm zu machen
quelle
Die Leute haben bereits ziemlich gut auf das Szenario geantwortet, in dem Sie Bigrams oder Trigramme benötigen, aber wenn Sie in diesem Fall jedes Gramm für den Satz benötigen , können Sie es verwenden
nltk.util.everygrams
Wenn Sie ein Limit haben, wie im Fall von Trigrammen, bei denen die maximale Länge 3 sein sollte, können Sie den Parameter max_len verwenden, um ihn anzugeben.
Sie können einfach den Parameter max_len ändern, um jedes Gramm zu erreichen, dh vier Gramm, fünf Gramm, sechs oder sogar hundert Gramm.
Die zuvor erwähnten Lösungen können modifiziert werden, um die oben erwähnte Lösung zu implementieren, aber diese Lösung ist viel einfacher als diese.
Für weitere Informationen klicken Sie hier
Und wenn Sie nur ein bestimmtes Gramm wie Bigram oder Trigramm usw. benötigen, können Sie die nltk.util.ngrams verwenden, wie in MAHassans Antwort erwähnt.
quelle
Sie können einfach Ihre eigene Funktion aufrüsten, um dies zu tun, indem Sie
itertools
:quelle
izip(*(islice(seq, index, None) for index, seq in enumerate(tee(s, N))))
ich es nicht ganz verstehe?Ein eleganterer Ansatz, um Bigrams mit Python zu bauen
zip()
. Konvertieren Sie einfach die ursprüngliche Zeichenfolge in eine Liste vonsplit()
und übergeben Sie die Liste einmal normal und einmal um ein Element versetzt.quelle
Ich habe mich nie mit nltk befasst, sondern N-Gramm als Teil eines kleinen Klassenprojekts gemacht. Wenn Sie die Häufigkeit aller in der Zeichenfolge vorkommenden N-Gramme ermitteln möchten, finden Sie hier eine Möglichkeit, dies zu tun.
D
würde Ihnen das Histogramm Ihrer N-Wörter geben.quelle
collections.Counter(tuple(strparts[i:i+N]) for i in xrange(len(strparts)-N))
wird schneller als die try-außer arbeitenFür four_grams ist es bereits in NLTK enthalten . Hier ist ein Code, der Ihnen dabei helfen kann:
Ich hoffe, es hilft.
quelle
Sie können sklearn.feature_extraction.text.CountVectorizer verwenden :
Ausgänge:
Sie können eine
ngram_size
beliebige positive Ganzzahl festlegen . Das heißt, Sie können einen Text in vier Gramm, fünf Gramm oder sogar hundert Gramm aufteilen.quelle
Wenn Effizienz ein Problem ist und Sie mehrere verschiedene n-Gramm erstellen müssen (bis zu hundert, wie Sie sagen), aber Sie reines Python verwenden möchten, würde ich Folgendes tun:
Verwendung :
~ Gleiche Geschwindigkeit wie NLTK:
Repost von meiner vorherigen Antwort .
quelle
Nltk ist großartig, aber manchmal ist es ein Overhead für einige Projekte:
Anwendungsbeispiel:
quelle
Sie können alle 4-6 Gramm mit dem folgenden Code ohne anderes Paket erhalten:
Die Ausgabe ist unten:
Weitere Details finden Sie in diesem Blog
quelle
Nach ungefähr sieben Jahren ist hier eine elegantere Antwort mit
collections.deque
:Ausgabe:
quelle
Wenn Sie eine reine Iteratorlösung für große Zeichenfolgen mit konstanter Speichernutzung wünschen:
Prüfung:
Ausgabe:
quelle