2010-11-22 6 views
0

Nachdem ich eine Keyword-API verwendet habe, um beliebte Keywords und Phrasen zu erhalten, bekomme ich auch eine Menge "schmutziger" Begriffe mit zu vielen zusätzlichen Wörtern ("the", "a" usw.).Wie säubere und verbessere ich eine Liste von Keywords?

Ich möchte auch Namen in den Suchbegriffen isolieren.

Gibt es eine Ruby-Bibliothek, um Keyword-Listen zu bereinigen? Gibt es einen solchen Algorithmus überhaupt?

+1

Ich habe 'ruby' zu Ihrem Tag-Liste. –

+1

Aber ich kann immer noch nicht herausfinden, was Sie fragen. Von welchem ​​Keyword-API sprichst du? Wo extrahiert es Schlüsselwörter/Phrasen? Für welche Suche gibt es "Suchbegriffe", von denen du sprichst? –

+0

Ich benutze AlchemyAPI, die Schlüsselwort-Methode extrahieren. Http://www.alchemyapi.com/api/keyword/ –

Antwort

5

Sie sprechen von "Stoppwörter", die Redewendungen sind, wie "das" und "a", plus Wörter, die so oft angetroffen werden, dass sie wertlos sind.

Stoppwortlisten existieren; Wordnet hat eine, wenn ich mich recht erinnere und es könnte eine in Lingua oder die Ruby Wordnet for Ruby oder readablity Module, aber wirklich sie sind ziemlich einfach, sich selbst zu generieren. Und Sie müssen wahrscheinlich, da die Junk-Wörter abhängig von einem bestimmten Thema variieren.

Am einfachsten führen Sie einen vorbereitenden Durchlauf mit mehreren Beispieldokumenten durch und teilen Sie Ihren Text in Wörter, dann durchlaufen Sie sie, und für jedes erhöhen Sie einen Zähler. Wenn Sie fertig sind, suchen Sie nach Wörtern, die zwei bis vier Buchstaben lang sind und unverhältnismäßig viel höher sind. Das sind gute Kandidaten für Stoppwörter.

Führen Sie dann die Zieldokumente durch und teilen Sie den Text so auf, wie Sie es zuvor getan haben. Dabei werden die Vorkommen gezählt, während Sie fortfahren. Sie können Wörter in Ihrer Stoppwortliste entweder ignorieren und sie nicht zu Ihrem Hash hinzufügen oder alles verarbeiten und dann die Stoppwörter löschen.

text = <<EOT 
You have reached this web page by typing "example.com", "example.net","example.org" 
or "example.edu" into your web browser. 

These domain names are reserved for use in documentation and are not available 
for registration. See RFC 2606, Section 3. 
EOT 

# do this against several documents to build a stopword list. Tweak as necessary to fine-tune the words. 
stopwords = text.downcase.split(/\W+/).inject(Hash.new(0)) { |h,w| h[w] += 1; h }.select{ |n,v| n.length < 5 } 

print "Stopwords => ", stopwords.keys.sort.join(', '), "\n" 

# >> Stopwords => 2606, 3, and, are, by, com, edu, for, have, in, into, net, not, or, org, page, rfc, see, this, use, web, you, your 

Dann sind Sie bereit einige Keyword-Sammlung zu tun:

text = <<EOT 
You have reached this web page by typing "example.com", "example.net","example.org" 
or "example.edu" into your web browser. 

These domain names are reserved for use in documentation and are not available 
for registration. See RFC 2606, Section 3. 
EOT 

stopwords = %w[2606 3 and are by com edu for have in into net not or org page rfc see this use web you your] 

keywords = text.downcase.split(/\W+/).inject(Hash.new(0)) { |h,w| h[w] += 1; h } 
stopwords.each { |s| keywords.delete(s) } 

# output in order of most often seen to least often seen. 
keywords.keys.sort{ |a,b| keywords[b] <=> keywords[a] }.each { |k| puts "#{k} => #{keywords[k]}"} 
# >> example => 4 
# >> names => 1 
# >> reached => 1 
# >> browser => 1 
# >> these => 1 
# >> domain => 1 
# >> typing => 1 
# >> reserved => 1 
# >> documentation => 1 
# >> available => 1 
# >> registration => 1 
# >> section => 1 

Nachdem Sie Sie Ihre Liste von Wörtern verengt haben, können Sie die Kandidaten durch WordNet laufen und Synonyme, Homonyme finden, Wort Beziehungen, Strip-Plural usw. Wenn Sie dies mit einer großen Menge an Text tun, sollten Sie Ihre Stoppwörter in einer Datenbank aufbewahren, in der Sie sie kontinuierlich verfeinern können. Das gleiche gilt für Ihre Keywords, denn von diesen können Sie beginnen, Ton und andere semantische Güte zu bestimmen.

+0

Sehr nett in der Tat! –

0

BTW, habe ich beschlossen, diesen Weg zu gehen:

bad_words = ["the", "a", "for", "on"] #etc etc 
# Strip non alpha chars, and split into a temp array, then cut out the bad words 
tmp_str = str.gsub(/[^A-Za-z0-9\s]/, "").split - bad_words 
str = tmp_str.join(" ") 
+1

Nur als Referenz, eine gute Stopword-Liste: http://www.ranks.nl/resources/stopwords.html –

+0

Mein Rat ist, etwas Code zu schreiben, um Ihre Stopword-Liste zu erstellen. Wenn Sie es manuell machen, werden Sie viel verpassen, weil unsere Augen nicht gut darin sind, Listen zu betrachten und kleine Details auszuwählen. Code ist pedantisch und wird sie nicht vermissen ... vorausgesetzt, Sie schreiben den Code richtig. Wenn Sie die lange Liste, die in diesem Link erwähnt wird, überprüfen, werden Sie feststellen, dass vollständige und abgekürzte Monatsnamen (2 und 3 Buchstaben), 2 und 3 Buchstaben Abkürzungen für Wochentage fehlen. Ich fügte auch Dinge wie "Millionen", "Hundert", Messungen und Wörter hinzu, die keine starken Bezeichner waren. –

Verwandte Themen