traductor que programacion pattern patrones ejemplos busqueda pattern-matching data-conversion name-matching

pattern-matching - que - pattern matching traductor



Registros coincidentes basados en el nombre de la persona (5)

Metaphone 3 es la tercera generación del algoritmo Metaphone. Aumenta la precisión de la codificación fonética del 89% de Double Metaphone al 98% , según se compara con una base de datos de las palabras en inglés más comunes y con nombres y palabras que no son en inglés que son familiares en América del Norte. Esto produce una codificación fonética extremadamente confiable para las pronunciaciones americanas.

Metaphone 3 fue diseñado y desarrollado por Lawrence Philips, quien diseñó y desarrolló los algoritmos originales Metaphone y Double Metaphone.

¿Existen herramientas o métodos que puedan usarse para hacer coincidir el nombre de una persona entre dos fuentes de datos diferentes?

Los sistemas no tienen otra información común y los nombres se han ingresado de manera diferente en muchos casos.

Ejemplos de coincidencias no exactas:

King Jr., Martin Luther = King, Martin (excluye el sufijo)
Erving, Dr. J. = Erving, J. (excluir prefijo)
Obama, Barak Hussein = Obama, Barak (excluye el segundo nombre)
Pufnstuf, HR = Pufnstuf, Haibane Renmei (abreviaturas de los partidos)
Tankengine, Thomas = Tankengine, Tom (hacer coincidir los apodos comunes)
Flair, Rick "the Natureboy" = Flair, Natureboy (coincide con el apodo)


A menudo empleo algoritmos de tipo soundex para este tipo de situación. Pruebe el algoritmo de doble metáfono . Si está utilizando SQL Server, existe algún código fuente para crear una función definida por el usuario.

Debido a que ha transpuesto datos, es posible que desee normalizarlos un poco, por ejemplo, elimine todas las comas y ordene las palabras resultantes por primera letra. Eso te dará un mejor potencial de emparejamiento. En el caso de que se hayan agregado palabras en el medio, se vuelve un poco más difícil. Podría considerar dividir un nombre en palabras, verificando con Double Metaphone si hay una palabra en la otra columna que coincida, y luego recopilar el recuento total de coincidencias contra palabras, lo que le dirá qué tan cerca están las dos columnas.

También filtraría palabras comunes como Dr., Sr., Sra., Sra., Etc., antes de hacer las comparaciones.


Aquí hay algunas opciones:

Algoritmos fonéticos ...

Soundex ( http://en.wikipedia.org/wiki/Soundex )

Doble metáfono ( http://en.wikipedia.org/wiki/Double_Metaphone )

Editar distancia ( http://en.wikipedia.org/wiki/Levenshtein_distance )

Distancia Jaro-Winkler ( http://en.wikipedia.org/wiki/Jaro-Winkler_distance )

Otra cosa que podrías intentar sería comparar cada palabra (dividir en espacio y quizás un guión) con cada palabra del otro nombre y ver cuántas palabras coinciden. Tal vez combine esto con algoritmos fonéticos para una coincidencia más difusa. Para un conjunto de datos enorme, desearía indexar cada palabra y relacionarla con una identificación de nombre. Para la coincidencia de abreviaturas puede comparar solo la primera letra. Probablemente quieras ignorar todo lo que no sea letras cuando comparas palabras también.

Muchos de los algoritmos fonéticos tienen fuente abierta / muestras en línea.


Es un problema muy complejo, y hay muchas herramientas costosas para hacerlo correctamente.
Si alguna vez te has preguntado por qué no puedes registrarte en un vuelo como Tom, Dick o Harry (o Bill)
O por qué las listas de exclusión aérea y las listas de vigilancia de terroristas no funcionan. Considere:

(1) Muammar Gadafi
(2) Mo''ammar Gadhafi
(3) Muammar Kaddafi
(4) Muammar Qadhafi
(5) Moammar El Kadhafi
(6) Muammar Gadafi
(7) Mu''ammar al-Qadafi
(8) Moamer El Kazzafi
(9) Moamar al-Gaddafi
(10) Mu''ammar Al Qathafi
(11) Muammar Al Qathafi
(12) Mo''ammar el-Gadhafi
(13) Moamar El Kadhafi
(14) Muammar al-Qadhafi
(15) Mu''ammar al-Qadhdhafi
(16) Mu''ammar Qadafi
(17) Moamar Gaddafi
(18) Mu''ammar Qadhdhafi
(19) Muammar Khaddafi
(20) Muammar al-Khaddafi
(21) Mu''amar al-Kadafi
(22) Muammar Ghaddafy
(23) Muammar Ghadafi
(24) Muammar Ghaddafi
(25) Muamar Kaddafi
(26) Muammar Quathafi
(27) Muammar Gheddafi
(28) Muamar Al-Kaddafi
(29) Moammar Khadafy
(30) Moammar Qudhafi
(31) Mu''ammar al-Gadafi
(32) Mulazim Awwal Mu''ammar Muhammad Abu Minyar al-Qadhafi

Y eso es solo la ortografía oficial, ¡no incluye errores tipográficos!


Tuve que usar una variedad de técnicas sugeridas. Gracias apuntándome en la dirección correcta (s). Con suerte, lo siguiente ayudará a alguien más con este tipo de problema para resolver.

Eliminar el exceso de caracteres

CREATE FUNCTION [dbo].[fn_StripCharacters] ( @String NVARCHAR(MAX), @MatchExpression VARCHAR(255) ) RETURNS NVARCHAR(MAX) AS BEGIN SET @MatchExpression = ''%[''+@MatchExpression+'']%'' WHILE PatIndex(@MatchExpression, @String) > 0 SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '''') RETURN @String END

Uso:

--remove all non-alphanumeric and non-white space dbo.fn_StripCharacters(@Value, , ''^a-z^0-9 '')

Dividir el nombre en partes

CREATE FUNCTION [dbo].[SplitTable] (@sep char(1), @sList StringList READONLY) RETURNS @ResultList TABLE ( [ID] VARCHAR(MAX), [Val] VARCHAR(MAX) ) AS BEGIN declare @OuterCursor cursor declare @ID varchar(max) declare @Val varchar(max) set @OuterCursor = cursor fast_forward for (SELECT * FROM @sList) FOR READ ONLY open @OuterCursor fetch next from @OuterCursor into @ID, @Val while (@@FETCH_STATUS=0) begin INSERT INTO @ResultList (ID, Val) select @ID, split.s from dbo.Split(@sep, @Val) as split where len(split.s) > 0 fetch next from @OuterCursor into @ID, @Val end close @OuterCursor deallocate @OuterCursor CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000)) RETURNS table AS RETURN ( WITH Pieces(pn, start, stop) AS ( SELECT 1, 1, CHARINDEX(@sep, @s) UNION ALL SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) FROM Pieces WHERE stop > 0 ) SELECT pn, LTRIM(RTRIM(SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 8000 END))) AS s FROM Pieces ) RETURN

Uso:

--create split name list DECLARE @NameList StringList INSERT INTO @NameList (ID, Val) SELECT id, firstname FROM dbo.[User] u WHERE PATINDEX(''%[^a-z]%'', u.FirstName) > 0 ----remove split dups select u.ID, COUNT(*) from dbo.import_SplitTable('' '', @NameList) splitList INNER JOIN dbo.[User] u ON splitList.id = u.id

Apodos comunes:

Creé una tabla basada en esta lista y la usé para unirme con nombres equivalentes comunes.

Uso:

SELECT u.id , u.FirstName , u_nickname_maybe.Name AS MaybeNickname , u.LastName , c.ID AS ContactID from FROM dbo.[User] u INNER JOIN nickname u_nickname_match ON u.FirstName = u_nickname_match.Name INNER JOIN nickname u_nickname_maybe ON u_nickname_match.relatedid = u_nickname_maybe.id LEFT OUTER JOIN ( SELECT c.id, c.LastName, c.FirstName, c_nickname_maybe.Name AS MaybeFirstName FROM dbo.Contact c INNER JOIN nickname c_nickname_match ON c.FirstName = c_nickname_match.Name INNER JOIN nickname c_nickname_maybe ON c_nickname_match.relatedid = c_nickname_maybe.id WHERE c_nickname_match.Name <> c_nickname_maybe.Name ) as c ON c.AccountHolderID = ah.ID AND u_nickname_maybe.Name = c.MaybeFirstName AND u.LastName = c.LastName WHERE u_nickname_match.Name <> u_nickname_maybe.Name

Algoritmos fonéticos (Jaro Winkler):

El asombroso artículo, Más allá de SoundEx - Funciones para la búsqueda aproximada en MS SQL Server , muestra cómo instalar y usar la biblioteca SimMetrics en SQL Server. Esta biblioteca le permite encontrar una similitud relativa entre cadenas e incluye numerosos algoritmos. Terminé usando principalmente a Jaro Winkler para hacer coincidir los nombres.

Uso:

SELECT u.id AS UserID ,c.id AS ContactID ,u.FirstName ,c.FirstName ,u.LastName ,c.LastName ,maxResult.CombinedScores from ( SELECT u.ID , max( dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName)) * dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName)) ) AS CombinedScores FROM dbo.[User] u, dbo.[Contact] c WHERE u.ContactID IS NULL GROUP BY u.id ) AS maxResult INNER JOIN dbo.[User] u ON maxResult.id = u.id INNER JOIN dbo.[Contact] c ON maxResult.CombinedScores = dbo.JaroWinkler(lower(u.FirstName), lower(c.FirstName)) * dbo.JaroWinkler(LOWER(u.LastName), LOWER(c.LastName))