Frage

Ohne einen Abschluss in Information Retrieval zu bekommen, würde ich gerne wissen, ob es irgendwelche Algorithmen existiert, um die Frequenz zu zählen, die Worte in einem bestimmten Textkörper auftreten. Das Ziel ist es, ein „allgemeines Gefühl“ zu bekommen, was die Leute sagen, eine Reihe von Text Kommentaren über. Nach dem Vorbild der Wordle .

Was ich möchte:

  • ignorieren Artikel, Pronomen, usw. ( 'a', 'ein', 'das', 'er', 'sie' usw.)
  • bewahren Eigennamen
  • ignorieren hyphenation, außer für weiche Art

nach den Sternen greifen, diese wären peachy:

  • Handhabung ergibt & Plurale (z wie, mag, mochte, mag das gleiche Ergebnis entspricht)
  • Gruppierung von Adjektiven (Adverbien usw.) mit ihren Themen ( "great service" im Gegensatz zu "groß", "Service")

Ich habe einige grundlegende Dinge Wordnet versucht verwenden, aber ich bin nur Dinge blind zwicken und gehofft, dass es für meine spezifischen Daten funktioniert. Etwas mehr Generika wäre toll.

War es hilfreich?

Lösung

Sie werden einen braucht es nicht, aber einige nette Algorithmen, nach dem Vorbild der folgenden.

  • Pronomen ignorieren über einen Stoppliste .
  • Erhaltung Eigennamen? Sie meinen, benannten Entitäten zu erfassen, wie Hoover Dam und sagen "es ist ein Wort" oder Komposita, wie Programmierung Sprache ? Ich gebe Ihnen einen Tipp geben: das ist hart ein, aber es existieren Bibliotheken für beide. Geben Sie für NER (Named Rechtsträger Erkennung) und lexikalischen Chunking. OpenNLP ist ein Java-Toolkit, das sowohl der Fall ist.
  • ignorieren hyphenation? Sie meinen, wie bei Zeilenumbrüche? Verwenden Sie reguläre Ausdrücke und überprüfen Sie das resultierende Wort über Wörterbuchsuche.
  • Handhabung Plurale / ergeben: Sie können die Schneeball stemmer . Es funktioniert der Trick gut.
  • „Gruppierung“ Adjektive ihrer Substantive sind in der Regel eine Aufgabe von flachen Parsing . Aber wenn Sie gezielt nach qualitativen Adjektive (gut, schlecht, shitty, erstaunlich ...) können Sie interessieren Sentiment-Analyse . LingPipe tut dies und vieles mehr.

Es tut mir leid, ich weiß, Sie sagten, Sie küssen wollte, aber leider Ihre Anforderungen sind nicht so leicht zu erfüllen. Dennoch gibt es Werkzeuge für all dies, und Sie sollten nur in der Lage sein, sie zusammen zu binden und nicht jede Aufgabe selbst durchführen müssen, wenn Sie nicht wollen. Wenn Sie eine Aufgabe ausführen möchten selbst, empfehle ich Ihnen zu ergeben aussehen, es ist die einfachste von allen.

Wenn Sie mit Java gehen, kombinieren Lucene mit der OpenNLP Toolkit. Sie werden sehr gute Ergebnisse erzielen, wie Lucene bereits eine stemmer in und viele Tutorial aufgebaut hat. Das OpenNLP Toolkit auf der anderen Seite ist schlecht dokumentiert, aber Sie werden nicht zu viel brauchen aus ihm heraus. Sie könnten auch interessiert sein an NLTK , in Python geschrieben.

Ich würde sagen, Sie Ihre letzte Forderung fallen, da sie flach Parsen beinhaltet und werden auf jeden Fall Ihre Ergebnisse nicht impove.

Ah, btw. die genaue Bezeichnung dieses Dokuments Zeitfrequenz, was Sie gesucht haben genannt wird TF-IDF . Es ist so ziemlich der beste Weg für Begriffe für Dokumenthäufigkeit zu suchen. Um es richtig zu machen, werden Sie nicht multidimenional Vektor Matrizen umgehen werden.

... Ja, ich weiß. Nach der Einnahme ein Seminar über IR, war mein Respekt für Google noch größer. Nachdem ich fiel ein paar Sachen in IR, mein Respekt für sie genauso schnell, though.

Andere Tipps

Willkommen in der Welt des NLP ^ _ ^

Alles, was Sie brauchen, ist ein wenig Grundwissen und einige Werkzeuge.

Es gibt bereits Tools, mit denen Sie, wenn ein Wort in einem Satz sagen, wird ein Substantiv, Adjektiv oder Verb ist. Sie werden part-of-speech Tagger . Typischerweise nehmen sie Klartext Englisch als Eingang und Ausgang des Wort, deren Basis bilden, und die Teil-of-speech. Hier ist die Ausgabe eines beliebten UNIX-Part-of-Speech-Tagger auf dem ersten Satz Ihres Beitrags:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

Wie Sie sehen können, es identifiziert „Algorithmen“, wie der Plural sein (NNS) von „Algorithmus“ und „existiert“ als eine Konjugation (VBZ) von „existieren.“ Es auch „a“ und „das“ wie „Determinatoren (DT)“ identifiziert - ein anderes Wort für den Artikel. Wie Sie sehen können, in Zeichen übersetzte die POS-Tagger auch die Zeichensetzung.

Um alles, aber die letzte Punkt auf der Liste zu tun, müssen Sie nur den Text durch eine POS-Tagger laufen, die Kategorien filtern, die Sie (Determinatoren, Pronomen etc.) nicht interessieren und zählen die Frequenzen der Grundformen der Wörter.

Hier sind einige beliebte POS-Tagger:

TreeTagger (binär nur: Linux, Solaris, OS- X)
GENIA Tagger (C ++: kompilieren Sie sich selbst)
Stanford POS Tagger (Java)

das letzte, was auf Liste zu tun, müssen Sie mehr als nur Wort-Level-Informationen. Eine einfache Möglichkeit, zu beginnen, ist durch Zählen Sequenzen von Wörter und nicht nur Worte selbst. Diese werden als n-Gramm . Ein guter Anfang ist UNIX für Poets . Wenn Sie bereit sind, in einem Buch über NLP zu investieren, würde ich Foundations of Statistical Natural Language Processing empfehlen .

Hier ist ein Beispiel dafür, wie Sie in Python tun könnten, dass die Begriffe in jeder Sprache ähnlich sind.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

Die erste Zeile wird nur Bibliotheken, die mit Teilen des Problems helfen, wie in der zweiten Zeile, wo urllib2 lädt eine Kopie von Ambrose Bierce des „Teufels Dictionary“ Die nächsten Zeilen machen Sie eine Liste aller Worte im Text, ohne Interpunktion, Unterbrechung, Zeichensetzung. Dann erstellen Sie eine Hash-Tabelle, die in diesem Fall ist wie eine Liste von eindeutigen Worten eine Nummer zugeordnet. Die for-Schleife geht über jedes Wort in dem Bierce Buch, wenn es bereits ein Datensatz dieses Wortes in der Tabelle, wobei jedes neues Auftreten fügt man zu dem Wert mit dem Wort in der Tabelle zugeordnet ist; wenn das Wort noch nicht erschienen ist, wird es in die Tabelle hinzugefügt, mit einem Wert von 1 (dh ein Vorkommen.) Für die Fälle, die Sie sprechen, würden Sie viel mehr Liebe zum Detail, zum Beispiel zahlen wollen Kapitalisierung mit Eigennamen zu identifizieren nur in der Mitte der Sätze zu helfen, usw., das ist sehr rau, aber drückt das Konzept.

in denen Um entwickelt wurde und Pluralisierung Sachen, experimentiert, dann schauen Sie in der 3rd-Party-Arbeit, ich habe es genossen Teile des NLTK, die ein akademisches Open-Source-Projekt, auch in Python.

Ich schrieb ein volles Programm zu tun, um diese nur eine Weile zurück. Ich kann später eine Demo laden, wenn ich nach Hause komme.

Hier ist ein Code (asp.net/c#): h ttp: //naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

Der erste Teil Ihrer Frage klingt nicht so schlecht. Alles, was Sie im Grunde tun müssen, ist jedes Wort aus der Datei (oder streamen w / e) und legen Sie sie in einen Präfix-Baum und jedes Mal, wenn Sie auf ein Wort passieren lesen, die Sie erhöhen den Wert mit ihm verbunden ist bereits vorhanden. Natürlich würden Sie eine Ignore-Liste von allem haben Sie auch aus Ihren Berechnungen verlassen möchten.

Wenn Sie einen Präfix-Baum verwenden stellen Sie sicher, dass jedes Wort zu finden, wird auf O (N), wobei N die maximale Länge eines Wortes in Ihrem Datensatz ist. Der Vorteil eines Präfixbaums in dieser Situation ist, dass, wenn Sie für Plurale suchen und ergeben Sie in O überprüfen (M + 1), wenn das für das Wort überhaupt möglich ist, wobei M die Länge des Wortes ohne Stiel oder mehrere (ist das ein Wort? hehe). Sobald Sie Ihr Präfixbaums gebaut haben würde ich es erneut analysiert für die Stämme und so und es verdichten nach unten, so dass die Wurzel des Wortes ist das, was die Ergebnisse enthält.

Beim Suchen Sie ein paar einfache Regeln an der richtigen Stelle könnte das Spiel positiv zurückkehren zu haben, falls der Wurzel oder Stiel oder was Sie haben.

Der zweite Teil scheint äußerst schwierig. Meine naive Neigung wäre getrennte Ergebnisse zu halten für Adjektiv-Thema Gruppierungen. Verwenden Sie die gleichen Grundsätze wie oben, aber nur halten sie trennen.

Eine weitere Option für die semantische Analyse könnte jeden Satz als einen Baum von Subjekt wird die Modellierung, Verb usw. Beziehungen (Satz hat ein Thema und Verb, Subjekt hat ein Nomen und Adjektive, etc). Sobald Sie alle Ihren Text bis auf diese Weise gebrochen haben scheint es, wie es ziemlich einfach sein könnte, durchlaufen und eine schnelle Zählung der verschiedenen entsprechenden Paarungen erhalten, die aufgetreten sind.

Nur ein paar Geschwafel, ich bin sicher, es gibt bessere Ideen, aber ich liebe es zu denken über diese Dinge.

Der Algorithmus Sie es gerade beschrieben. Ein Programm, das es aus der Box funktioniert mit einem großen Knopf zu sagen „Do it“ ... Ich weiß es nicht.

Aber lassen Sie mich konstruktiv sein. Ich empfehle Ihnen dieses Buch Programmierung Collective Intelligence . Kapitel 3 und 4 enthalten sehr pragmatische Beispiele (wirklich, keine komplexen Theorien, nur Beispiele).

U Worldnet Wörterbuch zu dem bekommt die grundlegenden Informationen der Frage Schlüsselwort wie seine Vergangenheit der Sprache, zu extrahieren Synonym verwenden kann, kann u kann auch das gleiche für Ihr Dokument tun, den Index für sie zu schaffen. dann können Sie ganz einfach das Stichwort mit dem Index-Datei übereinstimmen und Rang das Dokument. summerize es dann.

Alles, was Sie aufgeführt haben gehandhabt wird gut von spacigen .

  1. ignorieren einige Wörter - Verwendung Stoppwörter
  2. Auszug Thema - Teil der Sprache Tagging verwenden, es zu identifizieren (funktioniert aus der Box). Nach einem Satz analysiert wird, finden „ROOT“ - das Hauptverb des Satzes. Von den Parsing-Baum navigieren ein Substantiv finden, die zu diesem Verb bezieht. Es wird das Thema sein.
  3. Ignorieren hyphenation - ihre tokenizer Griffe Bindestriche in den meisten Fällen. Es kann leicht zu handhaben mehr Sonderfällen verlängert werden.

Wenn die Liste der Themen ist vorgegeben und nicht riesig, können Sie sogar noch weiter gehen: ein Klassifikationsmodell bauen, die das Thema vorherzusagen. Angenommen, Sie haben 10 Probanden haben. Sie sammeln Beispielsätze oder Texte. Sie laden sie in ein anderes Produkt: Wunder . Mit ihm ist toll Schnittstelle schnell Themen zu den Proben zugeordnet werden. Und schließlich, mit der kategorisierten Proben Sie das spacigen Modell trainieren, das Thema der Texte oder Sätze zu prognostizieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top