2013-03-19 4 views
10

Ich arbeite an Vorhersageproblem mit einem großen Textdatensatz. Ich bin die Umsetzung Bag of Words Model.Wie bekomme ich Text aus Textdaten?

Was ist der beste Weg sein, sollte die Tasche mit den Worten zu bekommen? Im Moment habe ich tf-idf der verschiedenen Wörter und die Anzahl der Wörter ist zu groß, um es für weitere Zuweisungen zu verwenden. Wenn ich tf-idf-Kriterien verwende, was sollte der tf-idf-Schwellenwert sein, um einen Sack voll Wörter zu bekommen? Oder sollte ich andere Algorithmen verwenden? Ich benutze Python.

+0

Ich bin nicht den verknüpften Artikel folgen. (Ich verstehe nicht, wie sie von einem Diktat zu den zwei "Vektoren" gehen, die sie haben). In jedem Fall werden Sie wahrscheinlich am Ende einen 'collections.Counter' verwenden - obwohl Sie vielleicht auch erklären möchten, was ein' tf-idf' ist ... – mgilson

Antwort

1

Sie sollten sich scikits-learn, die eine Reihe von dieser Funktionalität gebacken hat, überprüfen. Es gibt sogar einige sample code auf ihrer Website.

Eine weitere Option ist nltk, die viele nette Sprachverarbeitungsfunktionalität hat. Ich habe es nicht so oft benutzt, aber es scheint, als müsste es einige Möglichkeiten haben, um das zu tun, was du tust.

+0

Der Link ist tot. –

19

Verwenden des collections.Counter class

>>> import collections, re 
>>> texts = ['John likes to watch movies. Mary likes too.', 
    'John also likes to watch football games.'] 
>>> bagsofwords = [ collections.Counter(re.findall(r'\w+', txt)) 
      for txt in texts] 
>>> bagsofwords[0] 
Counter({'likes': 2, 'watch': 1, 'Mary': 1, 'movies': 1, 'John': 1, 'to': 1, 'too': 1}) 
>>> bagsofwords[1] 
Counter({'watch': 1, 'games': 1, 'to': 1, 'likes': 1, 'also': 1, 'John': 1, 'football': 1}) 
>>> sumbags = sum(bagsofwords, collections.Counter()) 
>>> sumbags 
Counter({'likes': 3, 'watch': 2, 'John': 2, 'to': 2, 'games': 1, 'football': 1, 'Mary': 1, 'movies': 1, 'also': 1, 'too': 1}) 
>>> 
+0

Für die Taschenwörter [0], ist es möglich, auf die Zeichenfolge "Likes" und ihre Anzahl zuzugreifen? –

+0

bagsofwords [0] ['likes'] sollte 2 (ungetestet) zurückgeben. – Paddy3118

1

Bag-of-Wörter-Modells ist ein schönes Verfahren zur Textdarstellung in verschiedenen Maschinenlernaufgaben angewandt werden. Aber im ersten Schritt müssen Sie Daten von unnötigen Daten bereinigen, zum Beispiel Interpunktion, HTML-Tags, Stoppwörter, ... Für diese Aufgaben können Sie leicht Bibliotheken wie Beautiful Soup (HTML-Markups entfernen) oder NLTK (zu entfernen) Stoppwörter) in Python. Nachdem Sie Ihre Daten gereinigt haben, müssen Sie Vektorfunktionen erstellen (numerische Darstellung der Daten für maschinelles Lernen). Hier spielt Bag-Of-Words die Rolle. scikit-learn hat ein Modul (feature_extraction Modul), das Ihnen helfen kann, die Tasche-von-Wörter-Funktionen zu erstellen.

Sie finden möglicherweise alles, was Sie im Detail in diesem tutorial benötigen auch this kann man sehr hilfreich sein. Ich fand beide sehr nützlich.

1

Wie andere bereits erwähnt, nltk Verwendung wäre die beste Wahl, wenn Sie etwas stabiler wollen, und skalierbar. Es ist in hohem Maße konfigurierbar.

Allerdings hat es den Nachteil einer ziemlich steilen Lernkurve, wenn Sie die Standardeinstellungen optimieren möchten.

Ich bin einmal auf eine Situation gestoßen, wo ich eine Tüte mit Worten haben wollte. Das Problem war, es betroffene Artikel über Technologien mit exotischen Namen voller -, _, etc. wie vue-router oder _.js usw.

Die Standardkonfiguration von nltk des word_tokenize ist vue-router in zwei separaten vue und router zur Trennung von Worten, zum Beispiel . Ich spreche nicht einmal über _.js.

Also für das, was es wert ist, schrieb ich diese kleine Routine, um alle Wörter in eine list, basierend auf meinen eigenen Satzzeichen Tokenized zu bekommen.

import re 

punctuation_pattern = ' |\.$|\. |, |\/|\(|\)|\'|\"|\!|\?|\+' 
text = "This article is talking about vue-router. And also _.js." 
ltext = text.lower() 
wtext = [w for w in re.split(punctuation_pattern, ltext) if w] 

print(wtext) 
# ['this', 'article', 'is', 'talking', 'about', 'vue-router', 'and', 'also', '_.js'] 

Diese Routine kann leicht mit Patty3118 beantworten über collections.Counter, kombiniert werden, der Sie führen könnte zu wissen, welche Anzahl von Malen _.js in dem Artikel erwähnt wurde, zum Beispiel.

0

aus einem Buch „Maschinelles Lernen Python“:

import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 
count = CountVectorizer() 
docs = np.array(['blablablatext']) 
bag = count.fit_transform(docs) 
5

Tasche von Worten als Matrix definiert werden, wobei jede Zeile ein Dokument und Spalten, die die einzelnen Token darstellt. Eine weitere Sache, die sequentielle Reihenfolge des Textes wird nicht beibehalten. Der Aufbau einer "Bag of Words" beinhaltet drei Schritte

  1. Tokenisieren
  2. Zählen

Einschränkungen Normalisierung im Auge zu behalten: 1. nicht Phrasen oder Multi-Wort erfassen können Ausdrücke 2 Englisch: eur-lex.europa.eu/LexUriServ/LexUri...0115: EN: HTML Sensibel auf Rechtschreibfehler, möglich, mit einem Sprecht Korrektor oder einer Zeichendarstellung zu umgehen,

zB

from sklearn.feature_extraction.text import CountVectorizer 
vectorizer = CountVectorizer() 
data_corpus = ["John likes to watch movies. Mary likes movies too.", 
"John also likes to watch football games."] 
X = vectorizer.fit_transform(data_corpus) 
print(X.toarray()) 
print(vectorizer.get_feature_names()) 
+0

Wir sollten auch eine der Antworten auswählen schließen diese q? – Pramit

+1

Ich denke, das zeigt am besten, wie ein BOW im Vergleich zu den anderen Antworten wirklich aussieht. '' ' >>> drucken (vectorizer.fit_transform (['die Katze ist blau', 'der Hund ist blau']). Toarray()) [[1 1 0 1 1] [1 0 1 1 1]] '' ' –