3 votos

Búsqueda de textos similares: algoritmos y evaluación

Me han pedido que cree un programa que clasifique textos similares a un texto de entrada dada una colección de textos.

Hasta ahora he estado usando una representación tdidf y similitud coseno con un montón de limpieza basada en regex. El vocabulario es muy específico, con muchos códigos, nombres de equipos y tablas.

El mayor problema que encuentro es evitar recuperar textos similares basándome en partes sin importancia de la entrada. Por ejemplo, para "Tengo un problema en la máquina ABCD módulo XYZ" no me gustaría recuperar "Tengo un problema en la máquina EDFG módulo WNM". Pero tal vez me gustaría recuperar "ABCD tiene problemas en XYZ".

Lo he solucionado identificando los casos problemáticos y añadiéndolos a una función de limpieza. Por ejemplo, podría eliminar las palabras {"I", "have", "a", "problem", "on"} del vocabulario, ya que no quiero que contribuyan a mi función de similitud. Obviamente, este enfoque no es muy escalable.

El segundo problema al que me enfrento es cómo calcular el rendimiento del modelo.

1voto

Zhubarb Puntos 2330

No sé en qué lenguaje estás implementando tu algoritmo, pero a continuación encontrarás algunas sugerencias con indicaciones de Python sobre cómo puedes implementarlas:

1. Aplicar eliminadores de palabras vacías que eliminen pronombres, preposiciones, etc. Para que no tengas que reinventar la rueda, a continuación te mostramos un ejemplo de implementación en Python:

import gensim
tokens = [t for t in tokens if t not in gensim.parsing.preprocessing.STOPWORDS]

2.Filtre su diccionario en función de las frecuencias. Esto sirve vagamente como regularización. Puede filtrar términos muy infrecuentes o frecuentes como se indica a continuación:

dictionary = gensim.corpora.Dictionary(docs)
dictionary.filter_extremes(no_below=15, no_above=0.5, keep_n=100000)

3.Es habitual aplicar el etiquetado Part of Speech y filtrar los términos que tienen etiquetas no deseadas o un peso diferente en función de la etiqueta. Por ejemplo, para algunas tareas de análisis de sentimientos, los programadores sobreponderan los adjetivos y los verbos frente a otros términos. A continuación se muestra un ejemplo sencillo:

import ntlk
text = word_tokenize("And now for something completely different")
nltk.pos_tag(text)
>>[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
('completely', 'RB'), ('different', 'JJ')]

Por último, tener una "función de limpieza" específica para una aplicación es razonable, siempre y cuando se utilice lo que ya existe y sólo se emplee la función de limpieza como complemento.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X