Calidad de las frases de wikipedia

El corpus que tengo solo lo estoy usando para filtrar

1 Like

Ah ok, pero ten en cuenta que tu corpus puede que no tenga las palabras raras de mi extracción de wikipedia y supongo que queremos es hacer una blacklist con ellas, en vez de una whitelist con las más frecuentes en general.

Voy incluir las nuevas de Wikipedia, hacer una limpieza que veo aún se puede y volver a probar.

Aquí el índice de coincidencias :https://send.firefox.com/download/d9458d6bd7b66c09/#94iaYgZTq8XdLOGOUILePg

Aún veo palabras incorrectas con altas repeticiones :confused:

Yo creo que lo importante es minimizar esas palabras pero sin afectar demasiado a la reducción total, va a ser imposible que no haya ninguna.

¿Te salen números similares a los de mi tabla de más arriba? ¿ves algún patrón para las palabras que sigue saliendo con más de 5 repeticiones?

Estos son usando las que tienen igual o menos 5-10-20 coincidencias como filtro.

No, me queda diferente.

Número de repeticiones Frases afectadas
<=5 99600
<=10 142964
<=20 197694

Sí, aún salen muchos apellidos. El problema que veo con los apellidos es que causa que palabras raras pero correctas queden casi con la misma cantidad de repeticiones.

No entiendo cómo puede quedar tan diferente, ¿puedes probar con el script que dejé más arriba? Solo con una repetición hay más de 200K

Con la nueva versión del script los números se vuelven más locos:

433102 palabras únicas.
112300 palabras con 2 repeticiones.

Me parece demasiado, ya que implicaría eliminar al menos 657702 frases. Quizá haya que pensar un método más adecuando, ya que creo que estamos matando moscas a cañonazos.

Podríamos intentar buscar palabras que tengan letras que no pueden ir juntas en español (por lo que no podemos pronunciarlas) y luego palabras que sean muy largas (definiendo un tamaño que las haga de por si complejas).

Haciendo unas pruebas con el spacy me encontré con que spacy tiene una propiedad para saber si una palabra le corresponde un vector, puede ser que con esto podamos sacar una mejor blacklist.

Con el siguiente código sobre la lista de palabras con una sola coincidencia:

import spacy
print('spaCy Version: %s' % (spacy.__version__))
spacy_nlp = spacy.load('es_core_news_md')

doc = spacy_nlp(u'cosell mavisa epidrmica tsuchiya jrue allitt castigarla mcconville kolhrster dicroicos homeomorfo slipak homolgica gesink barbam silmarin ishioka ursi adunaico impusieran.')

for token in doc:
  print(token.text,   token.has_vector)

Me está dando el siguiente resultado :

cosell False
mavisa False
epidrmica False
tsuchiya False
jrue False
allitt False
castigarla True
mcconville False
kolhrster False
dicroicos True
homeomorfo False
slipak False
homolgica False
gesink False
barbam False
silmarin False
ishioka False
ursi True
adunaico False
impusieran True

Lo que pasa con esto es que ayudaría a sacar las que están correctas de la lista de bajas coincidencias.

Aún no tengo tiempo de hacer más pruebas, ni subirlo al github como tiene que ser.

¿Puede ser agregar otro campo al csv con spacy para saber si la palabra tiene vector y así hacer otro filtrado extra?

Prueba con las que tienen 5 repeticiones o menos y miramos a ver cuántas detecta como buenas y malas.

Se está tomando rato para los 3 millones de palabras, el spacy no es muy eficiente.

Correcto, haré diferentes pruebas.

1 Like

Aquí está aplicando el filtro con 5/20/500 y eliminando también las que no están en el vocabulario de spacy

En los archivos está el filtro donde el campo bool indica si la palabra está fuera del vocabulario de spacy.

Con el filtro de 5 está eliminando 226k, ahora ¿Qué le parecen las sentencias que se están manteniendo?

Yendo a la carpeta de /5/ y comparando las valid con las deleted, parece que en general están deleted las más complejas y una reducción de 226K no parece muy excesiva, ¡gran trabajo! :muscle:

Lo que no me queda completamente claro es el filtro que hemos aplicado aquí (o como explicarlo en palabras sencilla), por lo que entiendo hemos eliminado frases que tiene palabras:

  • Con menos de 5 repeticiones (¿en la lista original que subí yo o en wikipedia en general?)
  • No están en el vocabulario de spacy (¿en qué consiste este vocabulario y qué contiene?)

Como actualización, comentar que sería ideal que durante la semana que viene tuviéramos la lista final de frases en español para añadir el viernes 12 a la aplicación, ya que queremos dejar todo listo para hacer una campaña en español la semana del 22 de julio (con promoción desde producto, redes sociales y listas de correo de mozilla) :smiley:

La lista que usé como filtro contiene las palabras de open subtitles, el wikipedia que yo tenía y el nuevo wikipedia de 1.5m sentencias.

El Spacy es una herramienta de NLP que fue entrenada usando los Corpus de Ancora y WikieNER, cuando el Spacy marca que una palabra no está en el vocabulario significa que no está en ninguno de estos dos corpus.

Es correcto, se han eliminado con 5 o menos de 5 y lo que marca spacy como fuera de vocabulario.

Interesante, quizá habría que subir una muestra aleatoria de 100 y otra de 1000 a pastebin (modo código para que salgan las líneas) para que al menos dos o más personas que no seamos nosotros nos den el ok :slight_smile:

Una vez que tengamos claros los filtros, sería bueno si podemos traducir eso a las reglas de filtrado del extractor, ya que así podría volverlo a ejecutar y conseguir más frases “limpias” sin tener que reducirlas.

@carlfm01 ¿puedes dar un vistazo al sistema de reglas y comentarnos si podemos hacer lo que propongo?

Estaba revisando el extractor y veo que están posiblemente usando los mismos dumps de wikipedia que yo usé, lo que haría que si lo cortaron de manera diferente las palabras raras aumenten en número.
Creo aquí lo correcto es volver hacer el filtro usando solo las sentencias que tengo para evitar causar que las palabras raras de wikipedia aumenten.

Aquí mi limitante es que no conozco Rust :confused:

Fíjate que el archivo de filtros que se ha creado no está en Rust, concretamente para que cualquiera pueda manipularlo sin saber un lenguaje en concreto:

Revisa el readme con la referencia de qué es cada config (si necesitamos algo más, se puede pedir que se haga en rust)

El experimento resultó peor, llega a los 300k de eliminadas y algunas contienen palabras bastante comunes.

Aquí la de 1000 : https://pastebin.com/hYTFavzV
Aquí la de 100: https://pastebin.com/F1LTUQeL

Aún veo que hay muchos nombres y apellidos muy raros, usé spacy para detectar los nombres de personas y así quedó:

https://pastebin.com/m0dRStse

El texto está dividido por tabs con el siguiente orden: (El foro no sirve bien con tabs, espero se entienda)

Makka fue parte de la banda por ocho años, Bernemann por más de veinte. -> sentencia
(Makka, Bernemann) -> lo que clasifica spacy como entidad
PER -> el tipo de entidad que clasificó, nos interesa PER de momento

¿Qué tal esa solución para tratar el problema de los nombres raros?

Habría que ver cómo implementamos el filtrado de spacy en el script para ejectuarlo de cero y que no nos reste del resultado final.

¿Tienes los comandos que ejecutaste en spacy y si hay que bajar algún modelo o algo?

Alternativamente podemos darle la lista de palabras al script y que las evite al hacer la extración.