Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Evitar duplicados de la misma empresa #31

Open
moon155 opened this issue Jan 20, 2018 · 20 comments
Open

Evitar duplicados de la misma empresa #31

moon155 opened this issue Jan 20, 2018 · 20 comments

Comments

@moon155
Copy link

moon155 commented Jan 20, 2018

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
Copy link
Contributor

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
Copy link
Author

moon155 commented Jan 20, 2018

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
Copy link
Contributor

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.

@Softman65 Softman65 reopened this Jan 20, 2018
@moon155
Copy link
Author

moon155 commented Jan 20, 2018

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
Copy link
Author

moon155 commented Jan 20, 2018

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
Copy link
Contributor

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
Copy link
Contributor

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
Copy link
Author

moon155 commented Jan 20, 2018

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
Copy link
Author

moon155 commented Jan 20, 2018

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
Copy link
Contributor

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Author

moon155 commented Jan 21, 2018

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
Copy link
Contributor

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
Copy link
Contributor

@moon155
Copy link
Author

moon155 commented Jan 23, 2018

El método:

  • buscar el nombre de la entidad (reducir triple+ letras en solo doble letras) en varias instancias de Searx (yo escrapeo la lista de todas las instancias del wiki de Searx)
  • en todos los resultados, coger las palabras que más aparezcan.
  • combinar las palabras (de + de 2 o 3 letras) entre sí y reanalizar los resultados para ver cuantas veces aparecen cada nueva combinación.
  • entre lo que más aparece, coger el primero que tenga < 3 alteraciones de Levenshtein, comparando las letras pegadas (sin espacios) y reduciendo doble-letras.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants