Seguimos internacionalizando la búsqueda de direcciones utilizando Sphinx o Manticore. Ahora Metaphone

Ésta es una continuación de la publicación “ Internacionalización de la búsqueda de direcciones de ciudades. Implementando el Soundex en ruso en Sphinx Search ”, en el que discutí cómo implementar el soporte para los algoritmos fonéticos de Soundex en Sphinx Search, para texto escrito en cirílico. El soporte de Soundex ya está disponible para texto latino. Lo mismo ocurre con Metphone, para el alfabeto latino, pero no para el alfabeto cirílico, pero intentaremos corregir este molesto hecho con la ayuda de transliteración, expresiones regulares y un archivo.





Esta es una continuación directa, en la que analizaremos cómo implementar el Metaphone original, Russian Metaphone (en el sentido de que no se necesita transliteración), Caverphone, y no podremos hacer Double Metaphone.





La implementación es adecuada para las plataformas Sphinx Search y Manticore Search.





Al final, veamos cómo Metaphone percibe el rakomakophone .





Imagen de Docker





Se preparó la imagen de la ventana acoplable tkachenkoivan / searchfonetic para que pueda "sentir" el resultado. Todos los índices de esta publicación y de la anterior se han agregado a la imagen, pero, atención, los nombres de los índices de la publicación anterior no corresponden a lo que está almacenado en la imagen. ¿Por qué? Porque viene un buen pensamiento.





La descripción de los algoritmos, de todos modos, se tomó de la publicación " Algoritmos fonéticos ". Intentaré duplicar el texto escrito en él lo menos posible.





Metaphone original

Se implementa de forma elemental, se crean expresiones regulares para transliteración:





	regexp_filter = (|) => a
	regexp_filter = (|) => b
	regexp_filter = (|) => v
      
      



Y enciende el metafono :





morphology = metaphone
      
      



, Soundex. , , , Soundex , Soundex, – , .





, , , Metaphone + . .





Sphinx blend_chars. , Sphinx , , , , – , , , .., .. , , , , «&». «M&M’s» ? «&»? blend_chars



.





, blend_chars



:





blend_chars = U+0020
      
      



, - “ ”, , , . , , .





mysql> select * from metaphone where match('');
+------+--------------------------------------+-----------+---------------------------+
| id   | aoguid                               | shortname | offname                   |
+------+--------------------------------------+-----------+---------------------------+
| 1130 | e21aec85-0f63-4367-b9bb-1943b2b5a8fb |         |               |
+------+--------------------------------------+-----------+---------------------------+
      
      



, « », call keywords



:





mysql> call keywords (' ', 'metaphone');
+------+---------------+------------+
| qpos | tokenized     | normalized |
+------+---------------+------------+
| 1    | morisa toreza | MRSTRS     |
| 1    | morisa        | MRS        |
| 2    | toreza        | TRS        |
+------+---------------+------------+
      
      



, : «morisa», «toreza» «morisa toreza», Metaphone, «».





Metaphone Sphinx Search. , . , , :





regexp_filter = [ ] => 
      
      



« », , , .





, , , .





Caverphone , .





mysql> call keywords (' ', 'caverphone');
+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | mrsa trza | mrsa trza  |
| 1    | mrsa      | mrsa       |
| 2    | trza      | trza       |
+------+-----------+------------+

mysql> select * from caverphone where match('');
Empty set (0.00 sec)
      
      



Soundex ( ), Sphinx, , , , , «morisa» «toreza» , «morisa toreza» :





mysql> call keywords (' ', 'simple_soundex');
+------+---------------+---------------+
| qpos | tokenized     | normalized    |
+------+---------------+---------------+
| 1    | morisa toreza | morisa toreza |
| 1    | morisa        | m620          |
| 2    | toreza        | t620          |
+------+---------------+---------------+
      
      



blend_chars



– , . metaphone. ( ) – : , .





.





Double Metaphone

Metaphone , , , .





, , Metaphone . , , , , DoubleMetaphone.java. , «C», , .





, , – , , , Sphinx Manticore.





, Metaphone . , . Sphinx . .





, , Java, Commons Codec. – , . , – , .





, , , . – .





, , :





DoubleMetaphone dm = new DoubleMetaphone();
String metaphone1 = dm.doubleMetaphone("Text", false);
String metaphone2 = dm.doubleMetaphone("Text", true);
      
      



metaphone1



metaphone2



.





– .





, Commons Codec. , . Metaphone , , . , : , , .





Sphinx .





Metaphone

.





. , . « », « Metaphone».





, , , .





, , . , « », «», «» , :





mysql> call keywords (' ', 'rus_metaphone');
+------+--------------+--------------+
| qpos | tokenized    | normalized   |
+------+--------------+--------------+
| 1    |        |        |
| 2    |         |         |
+------+--------------+--------------+
      
      



. , , GitHub Gist manticore.conf.





  • :





regexp_filter = (?i)(|||) => 
regexp_filter = (?i)(||) => 
regexp_filter = (?i)(||) => 
regexp_filter = (?i)() => 
      
      



  • , , , , , :





regexp_filter = (?i)()(||||||||||||||||) => \2
regexp_filter = (?i)()(||||||||||||||||) => \2
regexp_filter = (?i)()(||||||||||||||||) => \2
regexp_filter = (?i)()(||||||||||||||||) => \2
regexp_filter = (?i)()(||||||||||||||||) => \2
regexp_filter = (?i)()(||||||||||||||||) => \2
      
      



  • ,





regexp_filter = (?i)\b => 
regexp_filter = (?i)\b => 
regexp_filter = (?i)\b => 
regexp_filter = (?i)\b => 
regexp_filter = (?i)\b => 
regexp_filter = (?i)\b => 
      
      







regexp_filter = (?i)(||) => 
      
      



Caverphone

.





  • , :





regexp_filter = (A|a) => a
regexp_filter = (B|b) => b
      
      



, , , , .





  • e





regexp_filter = e\b =>
      
      



  • , , :





regexp_filter = \b(cough) => cou2f
regexp_filter = \b(rough) => rou2f
      
      







regexp_filter = (cq) => 2q
regexp_filter = (ci) => si
      
      



  • a, — 3





regexp_filter = (?i)\b(a|e|i|o|u|y) => A
regexp_filter = (?i)(a|e|i|o|u|y) => 3
      
      







regexp_filter = (j) => y
regexp_filter = \b(y3) => Y3

      
      



  • 2





regexp_filter = 2 => 
      
      



  • 3, A





regexp_filter = 3\b => A
      
      



  • 3





regexp_filter = 3 =>
      
      



10 .





:





mysql> select * from caverphone where match ('');
+------+--------------------------------------+-----------+------------------+
| id   | aoguid                               | shortname | offname          |
+------+--------------------------------------+-----------+------------------+
|    5 | 01339f2b-6907-4cb8-919b-b71dbed23f06 |         |          |
|  387 | 4b919f60-7f5d-4b9e-99af-a7a02d344767 |         |            |
+------+--------------------------------------+-----------+------------------+
      
      



«» «». , , , Daitch Mokotoff Soundex - «»:





mysql> select * from daitch_mokotoff_soundex where match ('');
+------+--------------------------------------+-----------+--------------+
| id   | aoguid                               | shortname | offname      |
+------+--------------------------------------+-----------+--------------+
|  387 | 4b919f60-7f5d-4b9e-99af-a7a02d344767 |         |        |
|  541 | 69b8220e-a42d-4fec-a346-1df56370c363 |         |        |
+------+--------------------------------------+-----------+--------------+
      
      



:





mysql> call keywords ('  ', 'caverphone');
+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | lnna      | lnna       |
| 2    | lnna      | lnna       |
| 3    | lna       | lna        |
+------+-----------+------------+


mysql> call keywords ('  ', 'daitch_mokotoff_soundex');
+------+-----------+------------+
| qpos | tokenized | normalized |
+------+-----------+------------+
| 1    | 866       | 866        |
| 2    | 8616      | 8616       |
| 3    | 866       | 866        |
+------+-----------+------------+
      
      



, , , - . , .





: .

, , . Just for fun.





, rock the microphone?! , Metaphone . !





-, blend_chars, rock the microphone, :





blend_chars = U+0020
      
      



- metaphone, .





keywords



Sphinx:





mysql> call keywords ('', 'metaphone');
+------+-------------+------------+
| qpos | tokenized   | normalized |
+------+-------------+------------+
| 1    | rakomakofon | RKMKFN     |
+------+-------------+------------+
      
      



rock the microphone:





mysql> call keywords ('rock the microphone', 'metaphone');
+------+---------------------+------------+
| qpos | tokenized           | normalized |
+------+---------------------+------------+
| 1    | rock the microphone | RK0MKRFN   |
| 1    | rock                | RK         |
| 2    | the                 | 0          |
| 3    | microphone          | MKRFN      |
+------+---------------------+------------+
      
      



RK0MKRFN, RKMKFN, 2(!). the , RKMKRFN:





mysql> call keywords ('rock microphone', 'metaphone');
+------+-----------------+------------+
| qpos | tokenized       | normalized |
+------+-----------------+------------+
| 1    | rock microphone | RKMKRFN    |
| 1    | rock            | RK         |
| 2    | microphone      | MKRFN      |
+------+-----------------+------------+
      
      



RKMKRFN RKMKFN, 1! .





«the», stopwords , - blend_chars = U+0020



«the» . , 1, .





La esperanza qsuggest



no se hizo realidad, no dará pistas. ¿Por qué? Puede notar que cuando llama keywords



hay dos columnas tokenized



y normalized



, qsuggest



da una pista sobre la columna tokenized



y mide la distancia de Levenshtein en relación con ella, qsuggest



no importa que allí, en normalized



, la distancia sea 1.





Por tanto, la observación es divertida, pero no práctica.








All Articles