it-swarm.com.de

So extrahieren Sie häufige / signifikante Ausdrücke aus einer Reihe von Texteingaben

Ich habe eine Reihe von Textelementen - rohes HTML aus einer MySQL-Datenbank. Ich möchte die häufigsten Ausdrücke in diesen Einträgen finden (nicht die häufigste Einzelphrase und im Idealfall keine Wort-für-Wort-Übereinstimmung erzwingen).

Mein Beispiel ist eine Bewertung auf Yelp.com, die 3 Ausschnitte aus Hunderten von Bewertungen eines bestimmten Restaurants im Format zeigt:

"Probieren Sie den Hamburger" (in 44 Bewertungen)

b. der Abschnitt "Highlights überprüfen" auf dieser Seite:

http://www.Yelp.com/biz/sushi-gen-los-angeles/

Ich habe NLTK installiert und habe ein bisschen damit gespielt, bin aber ehrlich gesagt von den Optionen überwältigt. Dies scheint ein weit verbreitetes Problem zu sein, und ich konnte bei der Suche hier keine eindeutige Lösung finden.

61
arronsky

Ich vermute, Sie möchten nicht nur die häufigsten Ausdrücke, sondern auch die interessantesten Kollokationen . Andernfalls könnte es zu einer Überrepräsentation von Phrasen kommen, die aus gebräuchlichen Wörtern und weniger interessanten und informativen Phrasen bestehen.

Dazu müssen Sie im Wesentlichen n-Gramm aus Ihren Daten extrahieren und dann diejenigen ermitteln, die die höchsten punktuelle gegenseitige Information (PMI) aufweisen. Das heißt, Sie möchten die Wörter finden, die viel häufiger zusammen vorkommen, als Sie es zufällig erwarten würden.

Die Anleitung NLTK-Kollokationen beschreibt, wie dies in etwa 7 Codezeilen durchgeführt wird, z.

import nltk
from nltk.collocations import *
bigram_measures = nltk.collocations.BigramAssocMeasures()
trigram_measures = nltk.collocations.TrigramAssocMeasures()

# change this to read in your data
Finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt'))

# only bigrams that appear 3+ times
Finder.apply_freq_filter(3)

# return the 10 n-grams with the highest PMI
Finder.nbest(bigram_measures.pmi, 10)
86
dmcer

Ich denke, Sie suchen nach Chunking . Ich empfahl, Kapitel 7 des NLTK-Buches oder vielleicht meinen eigenen Artikel über Blockextraktion zu lesen. Beide setzen Kenntnisse in der Spracherkennung voraus, die in Kapitel 5 behandelt wird.

4
Jacob

wenn Sie nur auf mehr als 3 ng kommen möchten, können Sie dies versuchen. Ich gehe davon aus, dass Sie den ganzen Müll wie HTML usw. abgestreift haben.

import nltk
ngramlist=[]
raw=<yourtextfile here>

x=1
ngramlimit=6
tokens=nltk.Word_tokenize(raw)

while x <= ngramlimit:
  ngramlist.extend(nltk.ngrams(tokens, x))
  x+=1

Wahrscheinlich nicht sehr pythonisch, da ich das erst seit ungefähr einem Monat mache, aber vielleicht eine Hilfe!

3
Toby

Zunächst müssten Sie wahrscheinlich alle HTML-Tags entfernen (nach "<[^>] *>" suchen und durch "" ersetzen). Danach könnten Sie den naiven Ansatz ausprobieren, nach den längsten gemeinsamen Teilzeichenfolgen zwischen zwei Textelementen zu suchen, aber ich denke nicht, dass Sie sehr gute Ergebnisse erzielen würden. Sie können es besser machen, indem Sie die Wörter normalisieren (auf ihre Grundform reduzieren, alle Akzente entfernen, alles in Klein- oder Großbuchstaben setzen) und dann und dann analysieren . Je nachdem, was Sie erreichen möchten, können Sie die Textelemente möglicherweise besser gruppieren, wenn Sie eine gewisse Flexibilität der Word-Reihenfolge zulassen, d. H. Die Textelemente als Taschen mit normalisierten Wörtern behandeln und die Ähnlichkeit des Tascheninhalts messen.

Ich habe ein ähnliches (wenn auch nicht identisches) Thema kommentiert hier .