「あいまい検索」 と 「ローマ字検索」
-
人名の「斉藤」の「斉」は全部で12種類もあるそうですが、あるファイルを「ファイルから検索」で「あいまい検索」から探したのですが「齋藤」はヒットしなかったので、「ローマ字検索」で saitou で検索したら、「齋藤」がヒットしました。
「あいまい検索」より、「ローマ字検索」のほうが使い勝手が良いというか、精度が高い印象を受けました。
Mery: 3.7.16 (x86)
Onigmo: 6.2.0
C/Migemo: 1.3
Tidy: 5.8.0
Hunspell: 1.7.1
uchardet: 0.0.8
アウトライン: 3.2.3 (Outline.dll)
お気に入り: 2.4.0 (Favorites.dll)
EditorConfig: 1.0.4 (EditorConfig.dll)
半角/全角変換: 2.4.0 (Conversion.dll)
OS: Windows 10 (Version 22H2, OS Build 19045.4780, 64-bit Edition)| Peggy | 返信 -
Meryの「あいまい検索」はレーベンシュタイン距離(厳密には制限ダメラウ・レーベンシュタイン距離)を使っています。
「斉藤」から「齋藤」だと、「斉→齋」の置換1回で済むのでレーベンシュタイン距離は1です。
類似度の計算は1 - レーベンシュタイン距離 ÷ 長い方の文の文字数なので、この場合の類似度は1 - (1 ÷ 2) = 0.5となります。
この値0.5 (50%)は「あいまい検索」の類似度の下限の「2/3 (66%)」を下回るのでマッチしないわけですね。
類似度の計算式を見る限り3文字以上でないと「あいまい検索」は上手く働かないと思います。
例えば3文字の「齋藤一」と「斉藤一」だと1 - (1 ÷ 3) = 0.666…なので類似度を「2/3 (66%)」に設定していればマッチします。一方、「ローマ字検索」はMigemoを使っています。(手動での導入での対応がVer 2.8.3、正式対応がVer 3.7.4)
仕組みはオリジナルのMigemoのページに書いてありますが、辞書(<Meryインストールフォルダ>\dict\migemo-dict)を使ってマッチする可能性がある単語すべてにヒットするように正規表現を自動的に生成しています。
saitouだとsaitou|saitou|彩陶|採灯|採燈|斉藤|斎藤|柴燈|濟棠|犀東|菜刀|菜湯|菜豆|蔡彤|裁頭|西塔|西東|西藤|西頭|載濤|齊藤|齋藤ですかね。(実際には被ってる文字をまとめて短くするようですけど)
辞書を必要とするので、検索ワードが辞書に載っているかどうかで見つかるかどうかは変わります。双方でそれぞれに強みがあるので使い分けが必要なんですね。
| barrackdo | 返信 -
Peggy さん、ご愛用いただきありがとうございます。
barrackdo さん、丁寧なご説明とサポートへのご協力、ありがとうございます。
「あいまい検索」と「ローマ字検索」の違いについては、まさに barrackdo さんのおっしゃるとおりで、説明が詳しくてすごいです😲
Peggy さんのご質問からすると、「斉」と「齋」みたいに、見た目が似ている文字を検索したいのかなと思います。
ただ、このあたりがちょっとややこしくて、レーベンシュタイン距離って「文字が似ているか」じゃなくて、「文字列としてどれくらい違うか」で判断する仕組みなんです。
なので、見た目の似てる・似てないまでは見ていない感じですね。
そこで、barrackdo さんの説明に少しだけ補足させてくださいね。(後半は重なるところもありますが、ご容赦ください)
たとえば「斉藤」の「斉」は Unicode で
U+6589、一方「齋藤」の「齋」はU+9F4Bと、文字コード的には全然違う文字なんです。読みはどちらも「さいとう」ですが、Unicode のルールでは「意味や読みが同じでも基になる文字が違うと別の文字」として扱われています。
なので Mery のあいまい検索でも別の文字として判定されてしまいます。
そこで Mery には「あいまい検索」のオプションで [異体字セレクタを無視する] という設定があって、これをオンにすると、「同じ基底文字」に異体字セレクタ (IVS) が付いている文字なら字体の違いを無視してヒットさせられます。
ただし、あいまい検索は「読み」で探すわけではありません。
たとえば「齋 (U+9F4B)」で検索すると、こんな異体字付きの文字にはヒットします。
齋󠄀 U+9F4B U+E0100; Adobe-Japan1; CID+5898 齋󠄁 U+9F4B U+E0101; Adobe-Japan1; CID+14170 齋󠄂 U+9F4B U+E0102; Hanyo-Denshi; JA6723 齋󠄃 U+9F4B U+E0103; Hanyo-Denshi; JTAD38 齋󠄄 U+9F4B U+E0104; Hanyo-Denshi; JTAD37 齋󠄅 U+9F4B U+E0105; Hanyo-Denshi; JTAD39Sでも「齊 (U+9F4A)」や「斉 (U+6589)」のように基になる文字が違う場合はヒットしません。
斉 U+6589 齊󠄀 U+9F4A U+E0100; Adobe-Japan1; CID+7457 齊󠄁 U+9F4A U+E0101; Adobe-Japan1; CID+14277 齊󠄂 U+9F4A U+E0102; Hanyo-Denshi; JA8378 齊󠄃 U+9F4A U+E0103; Hanyo-Denshi; IB1323 齍󠄀 U+9F4D U+E0100; Hanyo-Denshi; IP9F4D 齍󠄁 U+9F4D U+E0101; Hanyo-Denshi; KS549020 齎󠄀 U+9F4E U+E0100; Adobe-Japan1; CID+6779 齎󠄁 U+9F4E U+E0101; Adobe-Japan1; CID+13604 齏󠄀 U+9F4F U+E0100; Adobe-Japan1; CID+7174つまり、「齋」と「齊」は見た目は似ていても、あいまい検索の仕組みでは別物として扱われるんですね。
あいまい検索はあくまで「異体字セレクタの違い」を吸収する範囲までで、「読み」や「見た目の似てる・似てない」は考慮していません。
【参考】あいまい検索に対応
https://www.haijin-boys.com/software/mery/mery-3-5-0#1一方、ローマ字検索は「saitou」のようなローマ字入力から日本語の表記を広く探せる機能で、Migemo 辞書を使って正規表現を作っています。
barrackdo さんの説明がすごくわかりやすいのですが、たとえば「saitou」で検索すると、
- 西東
- サイトウ
- さいとう
などにもヒットします。
【参考】ローマ字検索に対応
https://www.haijin-boys.com/software/mery/mery-3-7-0#13というわけで、ざっくりまとめると、
- あいまい検索 → 異体字セレクタの違いはカバーできるけど、読みでは探せない
- ローマ字検索 → 読みから表記を探せるけど、異体字はカバーできない
それぞれ得意なところが違うので、使い分けていただければと思います。
| Kuro | 返信 -
私の素人丸出しの感想に丁寧に回答くださり、赤面しております。まさか、こんな大事になるとは。
あいまい検索は知っていましたが、あまり使う機会もなく、ローマ字検索は初めて知りました。
barrackdo さんが紹介されたサイト http://0xcc.net/migemo/ を見るとすでに20年の歴史を持ち、それなりに安定・熟成されたソフトのように思います。この機能を実装しているエディタは Mery だけの気がします。これから色々試させてもらいます。
有り難うございました。感謝します。| Peggy | 返信 -
> barrackdo さんが紹介されたサイト http://0xcc.net/migemo/ を見るとすでに20年の歴史を持ち、それなりに安定・熟成されたソフトのように思います。この機能を実装しているエディタは Mery だけの気がします。
更新されなくなってしまいましたので 使用はお勧めできない(>_<) のですがmigemoを使ったインクリメンタルサーチが xyzzy には2002年頃から拡張機能としてあります。
あと Vim系 や VS Code とかにも拡張機能として使われていると思います。それぞれ癖が強いのでこだわりもなくメモ帳の代わりに通常使用するなら動作の軽い Mery が一番良いのかなと思います(*‘ω’*)
| luna | 返信 -
>> Peggy さん
> 私の素人丸出しの感想に丁寧に回答くださり、赤面しております。まさか、こんな大事になるとは。
いえいえ。Mery の場合、ドキュメントも整備されてないですからね。
ただ「プログラミングがしたい!」という気持ちだけで作っていて、ドキュメントを書くのはどうしても後回しになってしまってます。フリーソフトの特権ということで、ご容赦ください…
2000 年代のフリーソフト的なノリでやっているところがありまして、「分からなかったら自分で調べるか、誰かに聞いてね」みたいなスタンスになっています。本当に分かりづらい点があれば、遠慮なくご質問くださいね。
>> luna さん
> 更新されなくなってしまいましたので 使用はお勧めできない(>_<) のですがmigemoを使ったインクリメンタルサーチが xyzzy には2002年頃から拡張機能としてあります。
xyzzy さん、その名前を聞くだけで胸が熱くなります…!
まさに伝説のフリーソフトなテキストエディター。五目並べ機能とか、開発者さんの遊び心と技術愛にあふれていて、「フリーソフト開発って面白いんだなぁ」と、当時かなり影響を受けました。
> > barrackdo さんが紹介されたサイト http://0xcc.net/migemo/ を見るとすでに20年の歴史を持ち、それなりに安定・熟成されたソフトのように思います。この機能を実装しているエディタは Mery だけの気がします。
たしかに、そうかもしれませんね。
Migemo は「ローマ字で日本語を検索できる」仕組みとして便利なのですが、実は辞書ファイルに GPL ライセンスが適用されているため、本体に組み込んで配布するには、アプリ全体をオープンソースで公開しなければならないという制約があるんです。
そのため、たとえば秀丸エディタさんのような市販ソフトでも、標準で Migemo を組み込むのは難しかったのかもしれません。
ただ最近、BSD ライセンスで辞書ファイルを生成できるツールを開発された方がいらっしゃって、そのおかげで Mery では辞書ファイルを同梱できるようになりました。
もちろん、本家の GPL 辞書ファイルと比べると、精度に若干の違いがある可能性もありますが、Mery では辞書ファイルの差し替えが可能なので、必要に応じて本家の辞書ファイルと入れ替えてご利用いただくことも可能です。
※その場合はライセンス条件にご注意くださいね。
| Kuro | 返信