[真理子日曜学校 - 聖書の言語入門(フレーム表示) ]
【17世紀英語コース】

SOUNDEX-発音を表す魔法の関数!?


  1. 英語の辞書は引きにくい
     よく「英語はたった26文字ですべての語を書くことができるからとても便利だ。日本語は何千何万も字を覚えねばならずとても大変だ」などという俗論を耳にしますが、物事の一面しかとらえていないたいへん浅はかな議論です。実は辞書をひくということに関しては、日本語のほうがはるかにラク、英語は大変なのです。
     日本語は音韻のしくみがきわめてシンプルなので、どんな未知の語でも、発音さえわかればそれをカナで表記することができます。カナで表記することさえできれば辞書をひくことが可能です。漢字で表記された読み方のわからない語を調べるのも、画数をたよりにひけば、面倒ですけど見つけることは可能です。
     しかし英語はつづりと発音の関係が極めて複雑だということを忘れてはいけません。それでも大ざっぱな規則性はあるので、未知の語でもつづりを見れば8割がたは正しい発音をすることができるでしょう。しかし逆に、発音しかわからない未知の語のつづりを当てるのは非常に困難です。
     ですから英語の辞書をひくときは、文字に書かれた語であればラクにひけますが、耳できいただけでつづりがわからない語をひくのは非常に困難なのです。いろいろな可能性を考えて一つ一つあたっていくしかありません。小型の辞書ならばまだしも、OEDのように何巻にもなる辞書や、Websterのように片手ではとてももてないようなデカくて分厚い辞書(なぜか米国の辞書はそういうのが多いですよね)では途方にくれます。たしか、ヘレン・ケラーを描いた映画『奇跡の人』の中で、サリヴァン先生がWebsterをうまくひけなくて苦労するシーンがありましたよね。
     「英語の辞書が発音でひけたなら」……英語話者なら誰しもそういう思いをしたことが何度もあることでしょう。
     その一方で英語の発音はけっこう複雑ですし、発音記号は難しいものです。実際、アメリカ人は国際音声記号(IPA)がお嫌いのようで、アメリカの辞書ではまずIPAは使われず、独自のヘンな表記の仕方をしたりします。発音でひくにしても、できるだけラクな方法をとりたいものです。
     また、つづりから発音を導き出すのはある程度規則的ではありますが、例外も多いので、結局は英単語のデータベースを作って表引きするしかありません。それでは大変なので、大ざっぱでもいいから機械的に導き出したい、しかし出てきた結果がまるきりイイカゲンでは困る、何かいい方法はないでしょうか。


  2. SOUNDEXの歴史
     SOUNDEXとは英語のスペルを発音の特性にしたがって4桁のコードとして表現する方法です。
     もともとは1910年代に開発され、1918年と1922年に特許が取得された方法です。
     当時の米国国勢調査で主に姓名のラストネームつまり姓の処理に使われたようです。詳しいことについてはSoundex @ Wikipediaをご覧ください。
    一般に欧米人の名は、ファーストネームつまり名のほうはバリエーションに乏しくみんな同じような名前をつけます。赤ちゃんの名前をつけるときにも、あらかじめ決められたリストの中からしか選べないとか、既存の名からしか選べないなどという制限をつけている国がほとんどです。日本でも赤ちゃんの名前をつけるときに人名用の漢字しか使えないというので時々トラブルになることがありますが、ヨーロッパ諸国はそれ以上に制限が厳しいのです。日本で「悪魔」という名前を市役所が受理せずトラブルになったという話がありましたが、ヨーロッパではそんな問題はそもそも起きないわけですね。このように名のほうはバリエーションに乏しいのですが、姓のほうはまちまちで、たとえばスミスさんはSmithありのSmythありのと大変、そこでこういうバリエーションを一括して処理できるような方法が求められ、SOUNDEXはそれにこたえたというわけです。
    このようにSOUNDEXは統計処理に使われはしましたが、人間が頭の中で使いこなすには難しい方法だったので、辞書や電話帳や名簿などの発音引きに使うというような使われ方はされず、半ば埋もれていました。それがコンピュータの登場で陽の目をみるようになり、プログラミングの泰斗クヌース(Knuth)先生が著書The Art of Computer Programming, vol. 3: Sorting And Searching(1973)で紹介して以来、「発音によるあいまい検索をするための方法」としてデータベースマネジメントシステムに取り入れられるようになり、MS SQLとかOracle、Lotus Notes/Domino、プログラミング言語PHP、パソコン用データベースソフトdBXL、各種スプレッドシートソフトなどで利用することができます。
     当サイトでも、KJV語彙集で取り入れてみました。


  3. SOUNDEXの威力を試してみよう
     ではさっそく、SOUNDEXの威力を試してみましょう。
     KJV語彙集を起動して、つづりのわからない語について、SOUNDEXの欄にいろいろ入力して遊んでみてください。その際、表示候補数はめいっぱい大きくしておくといいです(たとえば100とか)。
     たとえばメイドさんのメイド。もちろん正解はmaidなんですが、知らなきゃmadeとかmeidとか迷いますよね。そこでSOUNDEXのところにmeidoと入れます。なんか日本語のローマ字っぽいですね。するとmaadai、maadiah……と色々候補が出てきます。そのほとんどはトンチンカンなものですが、語義欄も見ながらそれっぽいものを探すと……6番目にmaidというのがありましたね。
     またたとえばチャンス。もちろん正解はchanceですけど、あれchanceだったかchanseだったか、なんて迷ったりしませんか。そこでSOUNDEXのところにchanseと入れてみます。何ならまたしても日本語ローマ字っぽくchansuでもいいですよ。すると4番目にchanceが出てきますよね。
     トンチンカンな候補も多いですけど、そんなの無視してささっと目でリストを追っていけば、これはけっこう使えそうだって思いませんか?
     では、SOUNDEXはどのような検索をして候補を出しているのでしょうか?


  4. SOUNDEXコード算出のアルゴリズム
     SOUNDEXにはさまざまな流儀の違いがありますが、ほぼ共通して用いられているアルゴリズム(計算法)を説明しましょう。birthdayという語のコードを計算してみます。
    1. 語をすべて大文字化する。(例)birthday→BIRTHDAY
    2. 語の先頭の文字を覚えておく。(例)B
    3. 2文字目以降のHとWをすべて取り除く。(例)BIRTHDAY→BIRTDAY
    4. 各文字を次のようにコード化する。
      1. B, F, P, V→1
      2. C, G, J, K, Q, S, X, Z→2
      3. D, T→3
      4. L→4
      5. M, N→5
      6. R→6
      7. その他の文字→0
      (例)BIRTDAY→1063300
    5. 同じコードが連続している部分を1字にまとめる。(例)1063300→10630
    6. 先頭のコードを元の文字に戻す。(例)10630→B0630
    7. 0をすべて除去する。(例)B0630→B63
    8. ここまでの結果が4字未満になってしまった場合は、4字になるまで末尾に0をつける。(例)B63→B630。
    このようにして、B630というコードが得られました。これをSOUNDEXコードとするのです。


  5. 要は母音抜き検索
     上項はSOUNDEXに興味を持たれた方がプログラミングやマクロなどを作成する上でわかりやすい書き方をしましたが、要するに何をやってるかがいまいちわからないかもしれません。そこで言語的特徴に即して説明しなおしましょう。要は
    1. 頭文字はいじらず、頭文字+3ケタの数字、計4字のコードとする。
    2. 母音およびH、Wを無視する。
    3. 子音を次のようにまとめる。
      1. パ・バ・ファ行系子音=1
      2. カ・サ行系子音を2
      3. タ行系子音=3
      4. 鼻音系子音=5
      5. L=4
      6. R=6
    4. 同系統子音が連続している部分はまとめる。その際、間にHまたはWをはさんだ場合はまとめていいが、母音をはさんだ場合は連続していないとみなし、まとめない。
    ということなのです。
     つまり簡単に言ってしまえば、母音を無視した検索なのです。英語ではつづりと発音の関係が複雑だといいますが、それは主に母音であって、子音に関してはかなり規則的です。そこで母音ぬき検索をすれば、つづりと発音のイレギュラーな関係をかわすことができるというわけです。
     子音は規則的とはいえ、カ行系の発音をするはずのcやgは直後にeやiが来るとサ行系の発音になります。またphがfになったりしますし、sは状況によってzの発音になったりします。そこで、そのように音変化する可能性のある子音のグループを一つにまとめてしまえば、つづりの複雑さを吸収することができます。
     また英語では、bossとかfullとか、子音は1つなのに2字で表すという場合があります。しかも全く同じ子音とは限らず、lockのようにcとkとで1つの子音を表すという場合もあります。このような子音連続は一つにまとめてしまったほうがいいというわけです。ただし途中に母音がはさまった場合は子音連続になりません。lockのcとkは子音連続ですが、cakeのcとkは別物というわけです。


  6. ローカルルール
     SOUNDEXの基本ルールは上記のとおりですが、処理系によっては手抜きをして、まるきり同じ字の連続はまとめるとしても類似音の子音連続のおまとめをしない場合もあります。逆に、統計処理で姓にSOUNDEXを適用するときは、Van, Con, De, Di, La, Leなどといった人名接頭辞は無視するとか、そういうローカルルールがけっこうあります。
     SOUNDEXは、このコード自体を情報交換に使うわけではなく、あくまで検索時に用いる一時的なコードです。利用者にコード自体を見せる必要すらありません。ですからデータベース設計者の考え方によっていろいろなローカルルールを採用してもいいのです。実際、外国語系固有名詞が多いデータを扱う場合は、上記の子音のグループわけをいじったりするケースもあるようです。
    その一例として、フランス語版SOUNDEXでは子音のグループわけが次のようになります(他のルールは同じみたいです)。
    1. B, P→1
    2. C, K, Q→2
    3. D, T→3
    4. L→4
    5. M, N→5
    6. R→6
    7. G, J→7
    8. S, X, Z→8
    9. F, V→9
    10. その他の文字→0
    ドイツ語SOUNDEXは英語のルールとほぼ同じ。ウムラウトは母音なのでやっぱり無視、ßはSに置き換えて処理(SSなんですけど子音重複はおまとめしちゃいますんで)、Yは無視ですが処理はHやWのほうに準じます。


  7. 当サイトのルール
     当サイトのKJV語彙集では上記のルールにしたがったうえで、さらに次の2つのルールをローカルルールとして採用しています。
    1. L=R……日本人にとってLとRの区別は難しいものです。ですからLもRも同一視しました(どちらもコード4とする)
    2. TH=S……同様に、日本人にはTHの発音はSやZのように聞こえますので、THはSに変換してから処理しています。
    あまりに同一視の条件を増やすといろいろヘンなものにヒットして候補が多くなってしまい、実用性をそこなってしまうのですが、L=RとTH=Sは、日本人としてはぜひ実現したいところなので、あえて加えました。


  8. 日本人にも有益
     SOUNDEXの考え方は英語話者の感覚を元にしているので、日本人にとってはいまいち実感がわかないところがありますが、母音を無視した検索というのは日本人にも役立つことでしょう。たとえば「日本人はAbraham→アブラハム(Aburahamu)みたいに子音で終わる音節のあとにuが入っちゃうんだよな」とよく言われます。しかし母音を無視するSOUNDEXでは同じコードになりますので、uが入るか入らないかうろ覚えでも検索ができるのは便利です。
     さらに、L=Rや、TH=Sという処理をすれば、カタカナ的発想によるイイカゲンなスペル入力でも、目的の語を検索できるようになります。
     SOUNDEXの考え方は、紙媒体の辞書では実現できないかもしれませんが、電子媒体の辞書ではもっともっと追求してもいいのではないでしょうか。