Open moon155 opened 6 years ago
Lo que se recoge del registro mercantil ya devería de haber pasado por ese filtro, pues veo que son instrucciones previas a la inscripción, parto de la teoría en cuanto a nombres de empresa, de que la denominación del BORME es la CORRECTA, sinó menudo cachondeo.
Muy buen punto Softman, pero nos impone parsear el borme entero antes de parsear cualquier otro boletín entonces. Que a lo mejor no es mala idea, pero hasta cuando conseguimos tener los BORME? vamos a conseguir todas las empresas que esten en el BOE desde el BORME, seguro?
perdonad lo he cerrado antes sin querer, no me he dado ni cuenta. todas las que aparecen en los BOLETINES NO, pues en los boletines si que cometen errores de todo tipo, EFECTIVAMENTE para que el proceso sea redondo primero se ha de obtener el borme, para luego machear con la misma rutina de generación de key única, desde BOLETINES, no salen todos pero si gran cantidad.
Y aún teniendo la lista (completa!!!) de nombres correctos de empresas, una vez parseamos el BOE, nos llegan nombres incorrectos. Como detectas de que empresa se trata? Esto de la key única lo podrías detallar porfa o apuntar donde se genera en el código?
Porque deberiamos entender si "Cañero Platano SL" === "Platano PLATANI ca NIERO SA" por ley misma, porque a lo mejor deberíamos ir cruzando fonética y algoritmo de palabras, algun analisis un poco raro... como para aproximar las personas (que es otro rollo, pero pasa igual..).
Me da que necesitamos diccionarios (.sql o .csv) que incluyan fonética y gramática. Hay por ahí, cuando tenga un ratito busco uno. Y en "el otro repo" he puesto un diccionario de nombres en /databases si quieres. +
son 2 procesos distintos la obtencion de una key única y la consulta de aproximados en la base de datos. la key única la generamos para poder "correr rápido" sobre todo sobre las relaciones. el campo Nombre, es indice FULL TEXT que te permite crear consultas por pesos de palabras. https://mariadb.com/kb/en/library/full-text-index-overview/
la key la calculo en base a la cadena con el modulo https://www.npmjs.com/package/aguid había otras opciones, pero teniendo en cuenta la velocidad es necesario que se genere por cadena, no por marcas de tiempo, requisito: misma cadena = misma key, eso permite buscar directamente keys calculadas en cualquier momento, no en base al momento en que se creó, se probó con una lib que ofrecía hashes mas cortos, pero allá por los 2.000.000 empezaba a reproducir duplicados.
a la key única que le das en entrada? me lo ubicas en el código please? y donde identificas duplicados en el código? gracias!
por nota, recursos interesantes: https://dumps.wikimedia.org/eswiktionary/20180101/ https://dumps.wikimedia.org/enwiktionary/20180101/ https://sourceforge.net/projects/mysqlenglishdictionary/ https://github.com/dwyl/english-words https://stackoverflow.com/questions/575089/where-to-get-a-database-of-spanish-english-translations http://www.omegawiki.org/Meta:Main_Page ;)
Quizá sea esto mejor manera de detectar si una palabra tiene significado: https://es.wiktionary.org/w/api.php?action=query&titles=testing https://es.wiktionary.org/w/api.php?action=query&prop=info&pageids=67313&inprop=url .. pero no llego a obtener la gramática de la palabra, que es lo que nos interesaría.
Por nota sólo... ;)
si claro https://github.com/Ingobernable/kaos155/blob/dev/App/node_app/_utils/BORME/Borme_Rutines.js
linea 875 : getUnique: function (_this, _name, _db, callback) {
En este código veo que generas el GUID en función de _name ("app.aguid(_name)"). Entonces el GUID dependerá entero del valor de _name. Que limpieza efectuas al nombre de empresa? Quitas acentos y espacios por ejemplo?
Oye y aparte, acabo de poner el dedo sobre algo que nos va a servir mucho me parece. Se llama "Fuzzy matching", y esta incorporado en MySQL en forma de "hash fonético"!! que surpresa.. Se llama SOUNDEX ;) Y también esta lo de "distancia de Levenshtein", que parece más apropiado en el momento de parsear, cuando hay más tiempo para analizar muchas lineas. Hasta han hecho una formula en MySQL!
https://stackoverflow.com/a/369834 https://es.wikipedia.org/wiki/Soundex https://es.wikipedia.org/wiki/Distancia_de_Levenshtein Enjoy, puro oro para kaos jeje
MariaDB [(none)]> select SOUNDEX("caaos"); +------------------+ | SOUNDEX("caaos") | +------------------+ | C000 | +------------------+
MariaDB [(none)]> select SOUNDEX("caous"); +------------------+ | SOUNDEX("caous") | +------------------+ | C000 | +------------------+
:D
Parece bastante común: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_soundex https://www.npmjs.com/browse/keyword/soundex http://php.net/manual/es/function.soundex.php http://php.net/manual/es/function.levenshtein.php
Leyendo toda esta doc, sospecho que Soundex solo funciona bien en ingles, mientras la distancia de Levenshtein funcionaría en cualquier idioma con alfabeto latin.
Y veo "metaphone" tb, pero ahí dice que es más preciso que soundex porque recoge las reglas de prononciación................ del ingles. O sea, mejor soundex entonces ;)
Y ahí esta el algoritmo para un metaphone ingles y otro español, me parece :)))) https://en.wikipedia.org/wiki/Metaphone https://es.wikipedia.org/wiki/Metaphone
Confirmo que usar ( levenshtein + searx + estadisticas de ocurrencias ) permite corregir los nombres de empresas de manera automática :))))
voddafon e -> Vodafone
tel e f o n ic a -> Telefónica
coca...co ll a -> Coca Cola
.. aunque vaya un poco lento para tener más precisión. Y soundex serviría más para corregir las búsquedas de los usuarios me parece...
Viva las APIs :)))
Afinando algoritmo, funciona muy bien para espacios que sobren, por lo menos!!!
voddafon e Vodafone
voddafon ee Vodafone
voddafon es Vodafone
sam ur Samur
gene r al m o t o r s General Motors
ib er d ro l a Iberdrola
tel e f o n ic a Telefónica
tel e f o n ic aa Telefónica And
tel e f o n ic aaa Telefónica And
coca...co ll a Coca Cola
coca...co lll a Coca Cola
coca...co llll a Coca Cola
Not bad :)
como la haces detalla un poco más, hay un caso a b b o t t f a r m a ce u tica Soci e da d an ó ni ma, en el boe que realmente lo he dejado por imposible
las transformaciones que hago a la empresa en el BORME estan en https://github.com/Ingobernable/kaos155/blob/dev/App/node_app/_utils/BORME/Borme_Transforms.js para el BOE y BOCM (Contratos) https://github.com/Ingobernable/kaos155/blob/dev/App/node_app/_utils/CONTRATOS/__Transforms.js
El método:
Algo así... pero para seleccionar "S o c i e d a d An o n i ma", mejor valdría usar regexp del tipo "S\s*O\s*C\s*I\s*E\s*D\s*A\s*D\s*A\s*N\s*O\s*N\s*I\s*M\s*A". La técnica que describo, me parece que serviría sobre todo para corregir nombres del tipo "a b b o t t f a r m a ce u tica" (> 50% de espacios / letras o algo así), o nombres que los usuarios (nosotros) declaren manualmente como mal escritos.
Hola!
Acabo de encontrar estos muy interesantes artículos 405 y 408!! http://www.rmc.es/documentacion/publico/RMC-%20Art%C3%ADculos%20que%20determinan%20la%20concesi%C3%B3n%20o%20denegaci%C3%B3n%20de%20las%20denominaciones%20sociales.pdf
Artículo 405. Prohibición de denominaciones oficiales.
-> se entiende que una denominación social puede ser "PLATANOS ANDALUCIA SL", pero no sólo "ANDALUCIA SL". no?
Artículo 408. Concepto de identidad.
PLATANOS CAÑEROS == PLATANO CAÑERO == CAÑERO PLATANO == CAÑEROS PLATANOS == CAÑEROS PLATANOS PLATANOS CAÑEROS == CAÑEROS PLATANO PLATANOS CAÑERO ???
-> para generar ID de empresa, normalizar las palabras al singular, ponerlas en orden alfabético, y quitar los duplicados. Sí?
2ª La utilización de las mismas palabras con la adición o supresión de términos o expresiones genéricas o accesorias, o de artículos, adverbios, preposiciones, conjunciones, acentos, guiones, signos de puntuación u otras partículas similares, de escasa significación.
CAÑERO PLATANO == CAÑERO-PLATANO == ¡¿..CAÑERO-PLATANO..+! == CAÑERÓ -- - -- PLATÄNO == EL CAÑERO PLATANO == POR EL CAÑERO PLATANO == POR_EL_CAÑERO_PLATANO ??? == EL CAÑERO PLATANO DE ESPAÑA ??? == EL CANERO PLATANO ??? identificais la "ñ" en este punto 2ª. ?!
-> quitar los acentos de cualquier letra (y la ñ??) -> para el ID, quitar conjunciones, preposiciones, adverbios, artículos y palabras de escasa significación (necesitamos un diccionario!!!!) -> reemplazar lo que no es alphanumérico por un espacio, y reducir todo a espacios únicos.
3ª La utilización de palabras distintas que tengan la misma expresión o notoria semejanza fonética.
PLATANO CAÑERO == PLATANI CAÑERO == PLATANHO CANIERO == PLATANO CANERO ??? la "ñ" se identifica a la "n" ???
-> a veces sí son varias empresas, si tienen la autorización de la primera empresa en tener la denominación social -> lo asimilamos siempre a un grupo de empresa entonces, no a la misma empresa...?
En la certificación expedida por el Registrador Mercantil Central se consignará la oportuna referencia a la autorización. La autorización habrá de testimoniarse en la escritura o acompañarse a la misma para su inscripción en el Registro Mercantil.
CAÑERO PLATANO SL == CAÑERO PLATANO SA == CAÑERO PLATANO SLU etc.. no?
Falta saber también si: CAÑERO BARBACOA == CAÑERO BARBECUE ?? (identidad entre idiomas) PLATANOS DE ESPAÑA SL == PLATANOS ESPAÑA SL == PLATANOS SL ???
Saludos