2010-11-22 24 views
0

Après avoir utilisé une API de mot-clé pour obtenir des mots-clés et des phrases populaires, j'ai aussi beaucoup de termes "sales" avec trop de mots supplémentaires ("le", "a", etc.). Je voudrais également isoler les noms dans les termes de recherche.Comment nettoyer et améliorer une liste de mots-clés?

Existe-t-il une bibliothèque Ruby pour nettoyer les listes de mots-clés? Un tel algorithme existe-t-il?

+1

J'ajouté 'ruby' à votre liste de tags. –

+1

Mais je n'arrive toujours pas à comprendre ce que vous demandez. De quelle API mot clé parlez-vous? Où extrait-t-il des mots-clés/phrases? Pour quelle recherche y a-t-il des "termes de recherche" dont vous parlez? –

+0

J'utilise AlchemyAPI, le mot clé extract methods.http: //www.alchemyapi.com/api/keyword/ –

Répondre

5

Vous parlez de "mots vides", qui sont des articles de style, tels que "le" et "a", plus des mots qui sont si souvent rencontrés qu'ils ne valent rien.

Des listes de mots vides existent; Wordnet en a un si je me souviens bien et il pourrait y en avoir un en Lingua ou les modules Ruby Wordnet for Ruby ou readablity, mais vraiment ils sont assez faciles à générer soi-même. Et, vous avez probablement besoin de puisque les mots indésirables varient en fonction d'un sujet particulier. La meilleure chose à faire est d'exécuter une passe préliminaire avec plusieurs exemples de documents et de diviser votre texte en mots, puis faire une boucle sur eux, et pour chaque incrément un compteur. Lorsque vous avez terminé, cherchez les mots longs de deux à quatre lettres et les chiffres sont disproportionnés. Ce sont de bons candidats pour les mots vides.

Puis exécutez passe sur vos documents cible, en séparant le texte comme vous l'avez fait précédemment, en comptant les occurrences que vous allez. Vous pouvez soit ignorer les mots dans votre liste de mots vides et ne pas les ajouter à votre hash, soit tout traiter, puis supprimer les mots vides.

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 

Alors, vous êtes prêt à faire une collecte mot clé:

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 

Une fois que vous avez réduit votre liste de mots que vous pouvez exécuter les candidats par WordNet et trouver des synonymes, homonymie, mot Si vous faites cela avec beaucoup de texte, vous devrez garder vos mots vides dans une base de données où vous pouvez les affiner continuellement. La même chose s'applique à vos mots-clés, car à partir de ceux-ci, vous pouvez commencer à déterminer le ton et les autres qualités sémantiques.

+0

Très bien en effet! –

0

BTW, j'ai décidé d'aller dans cette voie:

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

Juste pour référence, une bonne liste de mots vides: http://www.ranks.nl/resources/stopwords.html –

+0

Mon conseil est d'écrire du code pour construire votre liste de mots vides. Le faire manuellement manquera beaucoup parce que nos yeux ne sont pas bons à regarder les listes et à choisir les petits détails. Le code est pédant et ne les manquera pas ... en supposant que vous écrivez le code correctement. Si vous vérifiez la longue liste mentionnée dans ce lien, vous verrez qu'il manque des noms de mois complets et abrégés (2 et 3 lettres), des abréviations de 2 et 3 lettres pour les jours de la semaine. J'avais aussi l'habitude d'ajouter des choses comme "million", "cent", des mesures, et des mots qui n'étaient pas des identifiants forts. –