Dies ist eine Fortsetzung der Veröffentlichung „ Internationalisierung der Suche nach Stadtadressen. Implementierung des russischsprachigen Soundex in der Sphinx-Suche “, in dem ich die Implementierung der Unterstützung für die phonetischen Soundex-Algorithmen in der Sphinx-Suche für kyrillisch geschriebenen Text diskutierte. Soundex-Unterstützung für lateinischen Text ist bereits verfügbar. Dies gilt auch für Metphone für das lateinische Alphabet, jedoch nicht für das kyrillische Alphabet. Wir werden jedoch versuchen, diese ärgerliche Tatsache mithilfe von Transliteration, regulären Ausdrücken und einer Datei zu korrigieren.
Dies ist eine direkte Fortsetzung, in der wir analysieren werden, wie das ursprüngliche Metaphon, das russische Metaphon (in dem Sinne, dass keine Transliteration erforderlich ist), Caverphone implementiert werden und wir kein Doppelmetaphon herstellen können.
Die Implementierung ist sowohl für die Sphinx Search- als auch für die Manticore Search-Plattform geeignet.
Lassen Sie uns am Ende sehen, wie Metaphone das Rakomakophon wahrnimmt .
Docker-Bild
Das Docker-Bild tkachenkoivan / searchfonetic wurde so vorbereitet , dass Sie das Ergebnis "fühlen" können. Alle Indizes aus dieser und der vorherigen Veröffentlichung wurden dem Bild hinzugefügt, aber die Namen der Indizes aus der vorherigen Veröffentlichung entsprechen nicht dem, was im Bild gespeichert ist. Warum? Weil ein guter Gedanke danach kommt.
Die Beschreibung der Algorithmen wurde dennoch der Veröffentlichung " phonetische Algorithmen " entnommen . Ich werde versuchen, den darin geschriebenen Text so wenig wie möglich zu duplizieren.
Original Metaphon
Es ist elementar implementiert, es werden reguläre Ausdrücke für die Transliteration erstellt:
regexp_filter = (|) => a
regexp_filter = (|) => b
regexp_filter = (|) => v
…
Und schalten Sie das Metaphon ein :
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, .
Die Hoffnung qsuggest
hat sich nicht erfüllt - sie wird keine Hinweise geben. Warum? Sie können feststellen , dass Sie bei einem Anruf keywords
gibt es zwei Spalten tokenized
und normalized
, qsuggest
geben einen Hinweis auf der Säule tokenized
und Maßnahmen Levenshtein-Distanz relativ zu ihm, qsuggest
spielt es keine Rolle , dass es in normalized
dem Abstand 1 ist.
Daher ist die Beobachtung lustig, aber nicht praktisch.