2009-01-21 9 views
17

Je suppose que je pourrais prendre un texte et en retirer des mots anglais à haute fréquence. Par mots-clés, je veux dire que je veux extraire les mots qui caractérisent le plus le contenu du texte (tags). Il ne doit pas être parfait, une bonne approximation est parfaite pour mes besoins.Qu'est-ce qu'un moyen simple de générer des mots-clés à partir d'un texte?

Est-ce que quelqu'un a fait quelque chose comme ça? Connaissez-vous une bibliothèque Perl ou Python qui le fait? Lingua :: FR :: Tagger est exactement ce que j'ai demandé mais j'avais besoin d'une bibliothèque qui pourrait aussi fonctionner pour le texte français.

+0

Qu'est-ce que voulez-vous dire par "mot-clé"? – PEZ

+0

N'oubliez pas que la plupart des systèmes simples peuvent être trompés. Wirth a écrit le système d'exploitation THE. Maintenant, essayez googling pour cela ...: D –

Répondre

9

Vous pourriez essayer d'utiliser le module perl Lingua::EN::Tagger pour une solution rapide et facile.

Un module plus complexe Lingua::EN::Semtags::Engine utilise Lingua :: FR :: Tagger avec une base de données WordNet pour obtenir une sortie plus structurée. Les deux sont assez faciles à utiliser, il suffit de consulter la documentation sur CPAN ou d'utiliser perldoc après avoir installé le module.

3

La façon la plus simple de faire ce que vous voulez est ce ...

 
>>> text = "this is some of the sample text" 
>>> words = [word for word in set(text.split(" ")) if len(word) > 3] 
>>> words 
['this', 'some', 'sample', 'text'] 

Je ne connais pas de module standard qui fait cela, mais il ne serait pas difficile de remplacer la limite de trois mots de lettre avec une recherche dans un ensemble de mots anglais communs.

+0

Bonne réponse, mais je préciser que vous aurez besoin d'utiliser un "ensemble" de mots anglais plutôt que d'une liste afin que votre recherche est un temps constant et non O (n). –

+0

Bon point. J'ai modifié le test pour refléter cela. Merci :-) –

16

Le nom des "mots anglais à haute fréquence" est stop words et de nombreuses listes sont disponibles. Je ne connais aucune bibliothèque python ou perl, mais vous pouvez encoder votre liste de mots vides dans un arbre binaire ou un hash (ou vous pouvez utiliser le frozenset de python), puis, lorsque vous lisez chaque mot du texte d'entrée, vérifiez s'il est dans votre «liste d'arrêt» et filtrez-le.

Notez qu'après avoir supprimé les mots d'arrêt, vous devrez faire stemming pour normaliser le texte résultant (supprimer les pluriels, -ings, -eds), puis supprimer tous les "mots-clés" en double.

4

Pour trouver les mots les plus fréquemment utilisés dans un texte, faire quelque chose comme ceci:

#!/usr/bin/perl -w 

use strict; 
use warnings 'all'; 

# Read the text: 
open my $ifh, '<', 'text.txt' 
    or die "Cannot open file: $!"; 
local $/; 
my $text = <$ifh>; 

# Find all the words, and count how many times they appear: 
my %words = (); 
map { $words{$_}++ } 
    grep { length > 1 && $_ =~ m/^[\@a-z-']+$/i } 
    map { s/[",\.]//g; $_ } 
     split /\s/, $text; 

print "Words, sorted by frequency:\n"; 
my (@data_line); 
format FMT = 
@<<<<<<<<<<<<<<<<<<<<<<...  @######## 
@data_line 
. 
local $~ = 'FMT'; 

# Sort them by frequency: 
map { @data_line = ($_, $words{$_}); write(); } 
    sort { $words{$b} <=> $words{$a} } 
    grep { $words{$_} > 2 } 
     keys(%words); 

Exemple de sortie ressemble à ceci:

[email protected]:~/Desktop$ perl frequency.pl 
Words, sorted by frequency: 
for         32 
Jan         27 
am         26 
of         21 
your         21 
to         18 
in         17 
the         17 
Get         13 
you         13 
OTRS         11 
today         11 
PSM         10 
Card         10 
me          9 
on          9 
and         9 
Offline        9 
with         9 
Invited        9 
Black         8 
get         8 
Web         7 
Starred        7 
All         7 
View         7 
Obama         7 
+0

Façon un peu compliquée de faire la même chose qu'avec cet oneliner: perl -ne '$ h {$ 1} ++ alors que m/\ b (\ w {3,}) \ b/g; END {printf " % -20s% 5d \ n ", $ _, $ h {$ _} pour le tri {$ h {$ b} <=> $ h {$ a}} les clés grep {$ h {$ _}> 2}% h} ' –

2

Une solution de revêtement (mots de plus de deux caractères qui a eu lieu plus de deux fois):

perl -ne'$h{$1}++while m/\b(\w{3,})\b/g}{printf"%-20s %5d\n",$_,$h{$_}for sort{$h{$b}<=>$h{$a}}grep{$h{$_}>2}keys%h' 

EDIT: Si l'on veut trier par ordre alphabétique des mots avec la même fréquence peut utiliser améliorée un:

perl -ne'$h{$1}++while m/\b(\w{3,})\b/g}{printf"%-20s %5d\n",$_,$h{$_}for sort{$h{$b}<=>$h{$a}or$a cmp$b}grep{$h{$_}>2}keys%h' 
+0

J'aime celui-ci :) – JDrago

+0

J'ai ajouté un amélioré pour vous ;-) –

0

Je pense que la façon la plus précise qui maintient encore un semblant de simplicité serait de compter les fréquences de mots dans votre source, poids les selon leurs fréquences dans l'usage commun anglais (ou n'importe quelle autre langue). Les mots qui apparaissent moins fréquemment en usage courant, comme «café», sont plus susceptibles d'être un mot-clé que les mots qui apparaissent plus souvent, comme «chien». Pourtant, si votre source mentionne «chien» 500 fois et «café» deux fois, il est plus probable que «chien» soit un mot-clé même si c'est un mot courant.Décider du plan de pondération serait la partie difficile. TF-IDF (Frequency Terme - Frequency Document Frequency) est conçu pour cela.

0

Fondamentalement, il demande, quels mots sont fréquents dans ce document, par rapport à tous les documents?

Il donnera un score inférieur aux mots qui apparaissent dans tous les documents, et un score plus élevé aux mots qui apparaissent dans un document donné fréquemment.

Vous pouvez voir une feuille de calcul des calculs ici:

https://docs.google.com/spreadsheet/ccc?key=0AreO9JhY28gcdFMtUFJrc0dRdkpiUWlhNHVGS1h5Y2c&usp=sharing

(passez à l'onglet TFIDF en bas)

Voici une bibliothèque Python:

https://github.com/hrs/python-tf-idf

Questions connexes