Ingobernable / kaos155

Programa de analisis de Contratación con la administración pública y relaciones societarias en España.
GNU General Public License v3.0
17 stars 7 forks source link

Evitar duplicados de la misma empresa #31

Open moon155 opened 6 years ago

moon155 commented 6 years ago

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.

  1. Las sociedades y demás entidades inscribibles en el Registro Mercantil no podrán formar su denominación exclusivamente con el nombre de España, sus Comunidades Autónomas, provincias o municipios. Tampoco podrán utilizar el nombre de organismos, departamentos o dependencias de las Administraciones Públicas, ni el de Estados extranjeros u organizaciones internacionales.

-> se entiende que una denominación social puede ser "PLATANOS ANDALUCIA SL", pero no sólo "ANDALUCIA SL". no?

  1. Los adjetivos “nacional” o “estatal” sólo podrán ser utilizados por sociedades en las que el Estado o sus organismos autónomos ostenten directa o indirectamente la mayoría del capital social. Los adjetivos “autonómico”, “provincial” o “municipal” sólo podrán ser utilizados por sociedades en las que la correspondiente administración ostente directa o indirectamente la mayoría del capital social. El adjetivo “oficial” y demás de análogo significado sólo podrán ser utilizados por las sociedades en que la Administración Pública ostente la mayoría del capital.
  2. Las prohibiciones establecidas en este artículo no serán de aplicación cuando el empleo en la denominación de las expresiones a que se refieren se halle amparado por una disposición legal o haya sido debidamente autorizado.

Artículo 408. Concepto de identidad.

  1. Se entiende que existe identidad no sólo en caso de coincidencia total y absoluta entre denominaciones, sino también cuando se dé alguna de las siguientes circunstancias: 1ª La utilización de las mismas palabras en diferente orden, género o número.

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" ???

  1. Los criterios establecidos en las reglas 1ª, 2ª y 3ª del apartado anterior no serán de aplicación cuando la solicitud de certificación se realice a instancia o con autorización de la sociedad afectada por la nueva denominación que pretende utilizarse.

-> 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.

  1. Para determinar si existe o no identidad entre dos denominaciones se prescindirá de las indicaciones relativas a la forma social o de aquellas otras cuya utilización venga exigida por la Ley.-

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

Softman65 commented 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. image

moon155 commented 6 years ago

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?

Softman65 commented 6 years ago

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.

moon155 commented 6 years ago

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..).

moon155 commented 6 years ago

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. +

Softman65 commented 6 years ago

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/

Softman65 commented 6 years ago

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.

moon155 commented 6 years ago

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!

moon155 commented 6 years ago

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 ;)

moon155 commented 6 years ago

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... ;)

Softman65 commented 6 years ago

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) { image

moon155 commented 6 years ago

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

moon155 commented 6 years ago

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.

moon155 commented 6 years ago

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 ;)

http://php.net/manual/es/function.metaphone.php

moon155 commented 6 years ago

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

https://en.wikipedia.org/wiki/Phonetic_algorithm

moon155 commented 6 years ago

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 :)))

moon155 commented 6 years ago

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 :)

Softman65 commented 6 years ago

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

Softman65 commented 6 years ago

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

moon155 commented 6 years ago

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.