Saltar a contenido

Extracción de palabras

WordsExtractor(tokenizer=None, filter_punct=True, filter_nums=False, use_lexemes=False, stopwords=None, lowercase=False, ngram_range=(1, 1), min_len=0, max_len=0)

Clase para extraer palabras de un texto.

Excepciones:

  • ParameterError - un ngram_range que no es un par de enteros o cuyo límite inferior es menor que uno o mayor que el superior, un límite de longitud que no es un entero, un límite negativo, un mínimo mayor que el máximo, un interruptor que no es un bool;
  • SourceTypeError - palabras vacías que no son una colección de cadenas.

La clase extiende el WordsExtractor del núcleo anyTS con los ganchos del español:

Gancho Español
tokenize(text) el tokenizador por reglas de la clase de idioma español de spaCy, ests.utils.tokenize
lemmatize(word) los lemas de simplemma, ests.utils.lemmatize
number_pattern números con signo, rangos, fracciones, fechas, horas, porcentajes y ordinales: -5, +7, 1990-1995, 1.500,50, 12/03/2020, 3:30, 10%, 3.º, 1.ª, 2do

Nota

El tokenizador no necesita un modelo entrenado. Los signos de puntuación, incluidos ¿ y ¡, los números como 1.500,50, 3.º, 1990-1995 y las abreviaturas como Sr., EE. UU. son tokens únicos, y las abreviaturas de ests.constants.TOKENIZER_ABBREVIATIONS en cualquier caja (sr., SR., ee. uu., Pág., a.m.); las palabras con pronombres enclíticos (dámelo) no se separan. Las rayas de un diálogo pegadas a las palabras se separan: --No, sí--dijo, ―dijo él―. dan las palabras No, sí, dijo, él, también junto a los guiones bajos de la cursiva (--_Siguro_), mientras que un guion entre letras (franco-alemán) o ante una cifra (-5) se queda en su token; un sufijo citado con su guion (-mente) también lo pierde, y lo mismo el número de un punto de una lista (Artículo 1.- El objeto da el número 1). Una marca de orden de bytes al principio de un texto, como en un fichero leído con utf-8 en lugar de utf-8-sig, se separa y se descarta. ests.utils.add_dash_rules(nlp) añade las mismas reglas a las que ya tiene un pipeline de spaCy propio; el modelo de get_nlp ya las tiene, y los componentes de la biblioteca las añaden a su pipeline.

Nota

simplemma trabaja con un diccionario sin modelo entrenado: una forma conocida se convierte en su lema en minúsculas (Tienes - tener, NIÑOS - niño), una forma desconocida se devuelve sin cambios (Madrid, dámelo).

from ests import WordsExtractor

text = "No tengas 100 euros, ten 100 amigos"

we = WordsExtractor(use_lexemes=True, stopwords=["no"], filter_nums=True, ngram_range=(1, 2))
we.extract(text)
('tener', 'euro', 'tener', 'amigo', 'tener_euro', 'euro_tener', 'tener_amigo')

Parámetros

Parámetro Tipo Por defecto Descripción
tokenizer Pattern / Callable None Tokenizador o expresión regular; por defecto, el método tokenize
filter_punct bool True Filtrar los signos de puntuación
filter_nums bool False Filtrar los números que reconoce number_pattern
use_lexemes bool False Usar los lemas de las palabras del método lemmatize
stopwords Collection[str] None Palabras vacías, comparadas sin distinguir mayúsculas
lowercase bool False Convertir las palabras a minúsculas
ngram_range tuple[int, int] (1, 1) Límite inferior y superior del tamaño de los N-gramas
min_len int 0 Longitud mínima de la palabra extraída en caracteres, 0 sin límite
max_len int 0 Longitud máxima de la palabra extraída en caracteres, 0 sin límite

Nota

Una expresión regular como tokenizador es un separador para re.split. Los filtros se aplican en este orden: puntuación, números, lematización, minúsculas, palabras vacías, longitud de la palabra. Un signo de puntuación es un token solo de signos y símbolos, también de varios caracteres: ?!, --, …, € (anyts.utils.is_punctuation). Los tokens vacíos y de espacios se descartan antes de los filtros. Los N-gramas unen las palabras con _.

Nota

Una lista de palabras vacías ya hecha es spacy.lang.es.stop_words.STOP_WORDS; téngase en cuenta que incluye verbos frecuentes como tener.

Métodos

extract(text) extrae las palabras de un texto.

Parámetro Tipo Por defecto Descripción
text str - Cadena de texto

Un texto que no es una cadena y un tokenizador que no es invocable o no devuelve cadenas lanzan SourceTypeError.

Con el tokenizador por defecto, un texto con un carácter sin forma UTF-8, como el de un fichero leído con una codificación errónea, lanza SourceError, igual que las clases y funciones que extraen con él las palabras de una cadena.

get_most_common(n=10) devuelve las palabras más frecuentes del texto como una lista de pares (palabra, frecuencia), la más frecuente primero.

Parámetro Tipo Por defecto Descripción
n int 10 Número de palabras más frecuentes

Un número que no es un entero de al menos uno lanza ParameterError.

Aviso

El método debe llamarse después de extraer las palabras con extract.

we.get_most_common(3)
[('tener', 2), ('euro', 1), ('amigo', 1)]