2009-01-21 15 views
17

Supongo que podría tomar un texto y eliminar las palabras en inglés de alta frecuencia. Por palabras clave, quiero decir que quiero extraer las palabras que más caracterizan el contenido del texto (etiquetas). No tiene que ser perfecto, una buena aproximación es perfecta para mis necesidades.¿Qué es una forma simple de generar palabras clave a partir de un texto?

¿Alguien ha hecho algo como eso? ¿Conoces una biblioteca de Perl o Python que hace eso?

Lingua :: EN :: Tagger es exactamente lo que pregunté, sin embargo, necesitaba una biblioteca que también funcionara en francés.

+0

Lo ¿te refieres con "palabra clave"? – PEZ

+0

No olvide que la mayoría de los sistemas simples pueden ser engañados. Wirth escribió el sistema operativo THE. Ahora intenta buscar en Google ...: D –

Respuesta

9

Puede intentar usar el módulo perl Lingua::EN::Tagger para una solución rápida y fácil.

Un módulo más complicado Lingua::EN::Semtags::Engine utiliza Lingua :: EN :: Tagger con una base de datos de WordNet para obtener una salida más estructurada. Ambos son bastante fáciles de usar, solo revisa la documentación en CPAN o usa perldoc después de instalar el módulo.

3

La forma más sencilla de hacer lo que quiere es esto ...

 
>>> 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'] 

No sé de cualquier módulo estándar que hace esto, pero no sería difícil de reemplazar el límite de tres Palabras de letras con una búsqueda en un conjunto de palabras comunes en inglés.

+0

Buena respuesta, pero aclararía que querrás utilizar un "conjunto" de palabras en inglés de búsqueda en lugar de una lista para que tu búsqueda sea a tiempo constante y no a O (norte). –

+0

Buen punto. He editado la prueba para reflejar eso. Gracias :-) –

16

El nombre para las "palabras en inglés de alta frecuencia" es stop words y hay muchas listas disponibles. No conozco ninguna biblioteca de Python o Perl, pero podría codificar su lista de palabras paradas en un árbol binario o hash (o podría usar el juego frozenset de python), luego, cuando lea cada palabra del texto de entrada, verifique si es en su 'lista de detención' y filtrarlo.

Tenga en cuenta que después de eliminar las palabras de finalización, necesitará hacer un poco de stemming para normalizar el texto resultante (eliminar plurales, -ings, -eds), luego eliminar todas las "palabras clave" duplicadas.

4

para encontrar las palabras más utilizadas con frecuencia en un texto, hacer algo como esto:

#!/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); 

Ejemplo de salida es el siguiente:

[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

Little bit manera complicado de hacer lo mismo que con esta oneliner: Perl -ne '$ h {$ 1} ++ mientras m/\ b (\ w {3,}) \ b/g; end {printf" % -20s% 5d \ n", $ _ $ h $ _ {} $ de clase {h} {$ b $ <=> h {$ a}} {grep $ h $ _ {}> 2} teclas% h} ' –

2

Una solución de línea regular (palabras de más de dos caracteres que se produjo más de dos veces):

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 uno quiere ordenar alfabéticamente las palabras con la misma frecuencia se puede usar esta reforzada uno:

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

Me gusta este :) – JDrago

+0

He agregado uno mejorado para usted ;-) –

0

Creo que la forma más precisa que aún mantiene una apariencia de simplicidad sería la de contar las palabras frecuencias en su fuente, a continuación, el peso ellos de acuerdo a sus frecuencias en el uso del inglés común (o cualquier otro idioma).

Las palabras que aparecen con menos frecuencia en el uso común, como "cafetería" son más propensas a ser una palabra clave que las palabras que aparecen con más frecuencia, como "perro". Sin embargo, si su fuente menciona "perro" 500 veces y "café" dos veces, es más probable que "perro" sea una palabra clave, aunque es una palabra común.

La decisión sobre el sistema de ponderación sería la parte más difícil.

0

TF-IDF (Frecuencia de término - Frecuencia de documento inverso) está diseñado para esto.

Básicamente se pregunta, ¿qué palabras son frecuentes en este documento, en comparación con todos los documentos?

Dará una puntuación más baja a las palabras que aparecen en todos los documentos, y una puntuación más alta a las palabras que aparecen en un documento determinado con frecuencia.

Se puede ver una hoja de cálculo de los cálculos aquí:

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

(cambiar a la solapa TFIDF en la parte inferior)

Aquí es una biblioteca de Python:

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

Cuestiones relacionadas