近頃、タブレット・コンピューターが大きな注目を集めるようになっています。そのきっかけとなったのは、例えば Amazon Kindle™ と Apple® iPad の登場です。タブレット・コンピューターの可搬性と使い易さは、デスクトップ・コンピューターがこれまでに成し遂げた以上に、標準的な印字媒体からコンピューターへとテキストの表示媒体の移行を推し進める可能性を秘めています。このようなツールは、言葉をデジタル表現した場合の弱点を浮き彫りにします。つまり、テキストの表示という点では見事な仕事ぶりを発揮しますが、それはうわべだけの話にすぎません。
これまで、視覚的表現のためには多大な作業が行われてきました。外観の飾りに関する多くの問題 (フォント、間隔、余白、背景など、いずれも視覚的表現の要素) には、CSS が対処するようになっています。また、HTML と JavaScript によって、人間がより直観的に情報を読めるようにもなりました。
しかし、マシンにはそれ以上の能力があります。例えば、マシンは言葉の意味を、人間が必要とする以上に遥かに深いレベルで理解することも可能です。まだ対処されていない多くの問題 (少なくとも、一般的な日常の検索作業や執筆作業で対処されていない問題) のうちの 1 つに、曖昧性の除去という問題があります。つまり、真のコンテキストを知り、さらに重要な点として、プログラマーはマシンに使用可能なフォーマットで真のコンテキストを認識させなければなりません。
曖昧性は、IT ではよく知られた問題です。データ・セットが、ある意味を持つ可能性もあれば、別の意味を持っている可能性もあるといったように、両義に取れる場合があります。例えば画像を解読する際には、さまざまな問題が持ち上がってきます。ピクセルの集まりがある場合、それは何の画像なのでしょう?そして人間はその画像を何の画像であると認識するのでしょう?テキストの問題は画像よりも扱い易く、Natural Language Querying および自動的な (ただし不正確な) 曖昧性除去に関する研究である程度の注目を集めています。それでも、一般に表示されているテキストには依然として曖昧さを伴います。テキストの作成者が実際に何を意味してそのテキストを作成したかを知るには、この曖昧さを解決しなければなりません。
例えば、以下の単純な文を読んでみてください。
The cow jumped over the moon. |
The cow jumped over the moon. (牛がジャンプして月を飛び越えました。)
人間がこの文を読んで (ほぼ確実に) 思い起こすのは、戯詩が生活の大部分を占めていたかつての時代です。乳牛が地球の衛星を飛び越えるというのはなかなか素敵な発想ですが、極めて非現実的です。一方、この文は別のことを意味している可能性もあります。牛 (cow) はヘラジカ (cow moose) のことで、月 (moon) はオンタリオ州の Moon River のことだとすると (あるいは、同名のメコン川の支流を水牛が飛び越えるという意味にも取れます)、牛が飛び越えるという文は意味が通ります。この一文は、実際には何を意味するのでしょうか。その答えはコンテキストによって変わってきますが、この文にはコンテキストがありません。人間はときに、予備知識に基づいて推測することができます。けれどもマシンにはそれができないため、人間の役に立つことができません。マシンを利用することで、文意を推測する重要な機会が見過ごされてきたのです。
テキストに関して、曖昧性を除去することが重要である理由はさまざまにあります。例えば、以下に挙げる理由です。
- 検索。主要な検索エンジンが、ユーザーに対し、そのユーザーが行うリクエストの曖昧性を除去するように求めるかというと、そうはしません。検索エンジンは、ユーザーが用語を追加して十分な情報を提供していることを当てにして、誤った想定の下に検索を行ってしまうことがよくあります。また、ユーザーが誤った用語を選択したり、ソース・テキストが曖昧であったりすることもあります。いずれの場合にしても、検索アルゴリズムが助けになることはありません。
- 翻訳。例外的な言語はいくつかありますが、どの言語を使用して単語を表現するかに関わらず、検索エンジンは言語に依存しない共通のルート (概念) に帰着します。絶対ルートを参照することが、より正確な翻訳に役立つはずです。
- ルックアップ。テキストを読んでいる間、人間は辞書で単語を調べることができますが、辞書はただ単に、単語が持つ意味の候補を提示するだけです。辞書からは、テキストの作成者が意図している単語の意味を知ることはできません。作成者が意図的に曖昧にしようとしていた可能性もあります (通常、そのようなことはまずありませんが)。
- マシンによる解析。一連のテキストに関して、曖昧性が徹底して除去された情報があれば、マシンはそのテキストを共通の基準に従ってグループ分けし、同様の情報源に関する推奨案を提示することができます。いわゆる、強化されたデューイ十進分類法です。
曖昧性を除去する最も一般的な方法は、コンテキストを明確にするための具体的な詳細を含めた、明示的な文を前もって提供することです。追加の情報を提供すれば、人間の読者が読む上で役に立ちます。なぜなら、この情報を手掛かりに、ユーザーはこれまでに積み重ねてきた知識を適用してコンテキストを絞り込めるためです。しかし、このプロセスにはコストがかかります。ある単語の意味を伝えるためにユーザーにパラグラフを読ませるとなると、他でもっと有効に使える可能性のある時間が浪費されることになります。
マシンに対しては、どのように曖昧性を除去するのでしょうか。ある概念の意味を示すには、以下の方法を使えます。
- 参照を既知の絶対位置にリンクさせます。この絶対位置とは、曖昧性が完全に除去されたリスト (例えば WordNet (リンクについては「参考文献」を参照) など) に含まれるエントリーです。
- 概念が属するグループを識別します (乳牛とヘラジカの場合で言うと、両方とも動物のグループに属します)。
- 同じような概念を比較し、その 2 つを分け隔てる違いを指摘します。つまり、相対参照のことです (乳牛とヘラジカは見方によれば同類ですが、別の見方をすると異なります)。
プログラマーとしては、マシンが読者を支援できるようにする方法には関心があるはずです。以下に一例として、マシンに対して一般的な概念を明確にさせる方法を示します。
The <span title='moo-cow, milk cow, etc.'
style='color: blue'>cow</span> jumped over the moon.
|
上記のコードでは、HTML の <span> 要素に title という属性が含まれています。マウスを文中の単語に重ねると、この属性によって具体的な情報が表示されます。この、ユーザーに青色で表示されるテキストは、必要な場合にはさらに詳細な情報を提供できるということを示すマークアップです。この方法では、文中の単語の意味がよくわからなければ、マウスをその単語の上に重ねることによって、曖昧性除去のための静的な情報をポップアップとして表示することができます。最近のブラウザーでは、この機能と併せ、<abbr> と <acronym> という 2 つの HTML タグ、そして専用にプログラミングされた JavaScript の onmouseover() 関数が当たり前のように使用されています。そのすべては、ユーザーが十分な英語の知識を持っていることを前提としています。
皆さんは「何て面倒なんだ!」と言うことでしょう。「テキストの曖昧性を除去するために、テキストを作成する時間の 10 倍も費やすことになる!」という皆さんの言葉に対し、私はこう返します。「詳細な部分に十分注意を向けなければ、明確さという目標が打ち砕かれることになりませんか」。皆さんにこう言わせたのは、おそらく私が皆さんの予想よりも面倒な途方もない提案をしたからかもしれませんが、もちろん、面倒な作業の負担を軽くできれば、それ相当の見返りがあります。この続きを読めばわかるように、これよりもさらに容易で面倒の少ない方法があります。
ページ上で目にする単語は、氷山の一角でしかないと考えてください。この目に見える氷山の一角は、これまで (人間としての) ユーザーが認識し、その単語に関するコンテキストに基づいて解釈できるような形で表現されてきました。けれどもページの表面下には、例えば現在の文書の内外にある関連ソースへのリンクなど、目に見える以外の情報が山のように潜んでいます。
表面下に潜む豊富な情報を処理するには、XML を使用した以下の方法を使えます。リスト 1 の XML を見てください。
リスト 1. XML による高度な一般化
<?xml version="1.0" encoding="UTF-8" ?> <!-- Let's call this file myxml.xml --> <doc> <section id='1' hr='The'>The</section> <section id='2' hr='cow' wnssid='n02403454'>cow2</section> <section id='3' hr='jumped' wnssid='v01963942'>jump16</section> <section id='4' hr='over the'>over the</section> <section id='5' hr='moon' wnssid='n09358358'>moon2</section> </doc> |
リスト 1 にはルート要素の doc があり、そのコンテキスト内に複数の section 要素があります。各 section 要素には、特定のコンテキストにおいて有用な属性があります。これらの属性には、読者がアクセスすることができます。この時点では、基本となるポイントをおさえるために名詞と動詞の曖昧性だけを除去していることに注意してください。
そのままの形の XML を最終的に利用しようとしても、全く役に立ちません。そこでリスト 2 に、不特定の対象読者に対して XML の内容を提供する基本的な PHP スクリプトを記載します。
リスト 2. そのままの形の抽出
<?php
$xml = simplexml_load_file("myxml.xml");
foreach ($xml->section as $sec) {
echo "$sec ";
}
echo "\nDone\n";
?>
|
上記の PHP コードはまず、リスト 1 の XML データを object 変数に読み込みます。次に foreach 文を使用して、section 要素の内容をそのままの形で表示します。
このコードは最終的に、The cow2 jump16 over the moon2 という文字列になります。ここで、cow2、jump16、および moon2 は、マシンにもユーザーにも役に立たない任意のラベルですが、ここでは説明のために使用しています (この 3 つのラベルは実際には、クエリーによって WordNet データベースのローカル・コピーから返されるインデックス番号です)。この形で、The cow1 jump3 over the moon1 となると、それは全く別の意味を持つことになります。けれども人間には、その違いは明らかになりません。
表現の重要な原則の 1 つは、メッセージを対象読者に合わせて適応させることです。そこで、人間の読者を対象にした場合の抽出方法をリスト 3 に示します。
リスト 3. 人間を対象とした抽出
<?php
$xml = simplexml_load_file("myxml.xml");
foreach ($xml->section as $sec) {
echo $sec['hr']." ";
}
echo "\nDone\n";
?>
|
上記のコードがリスト 2 のコードと異なる点は、hr (human reader: 読者 (人間)) 属性のみをレポートし、結果的な文字列が The cow jumped over the moon となっていることです。これは初めに記載した文と同じで、より一般的な表現の特殊なケースであることを示しており、そのままの形で抽出した場合よりもわかりやすくなりましたが、それでもまだ明確ではありません。
次はリスト 4 に、マシン・リーダーを対象としたコードを記載します。
リスト 4. マシンを対象とした抽出
<?php
$xml = simplexml_load_file("myxml.xml");
foreach ($xml->section as $sec) {
echo $sec['wnssid']." ";
}
echo "\nDone\n";
?>
|
上記のコードは、wnssid (WordNet synsetid) だけを抽出しているという点でリスト 3 と異なります。データベースに保管され、annnnnnnn という形の一意に決まる鍵で識別される synset は、同義語をまとめたグループです。出力 (上記の場合は n02403454 v01963942 n09358358) によって、曖昧性を除去した内容がマシンに伝えられます。
この情報は、人間の読者にとってはあまりにもマシン向けに特化されすぎています。そこで、このコンテキストの echo 命令が別のルーチンでこの情報を使用できるようにして、そのルーチンが synset の内容を詳しく調べ、関連する従属情報を使用して読者を支援するようにします。こうすれば、関連する豊富なデータベース情報を WordNet から読者に渡せるようになります。さらに、cow、jumped、moon を青色のテキストで表示し、読者がマウスを単語に重ねると、WordNet 情報がポップアップ表示されるようにするという方法も使えます (「基本的な曖昧性除去」のセクションで使用した方法と同じです)。例えば、ID が v01963942 の synset から jumped に対して保管された情報を引き出して、leap、bound、spring という 3 つの単語を表示することができます。
元の「The」と「over the」は出力には現れていないことにお気付きかもしれませんが、この点は重要ではありません。外部ルーチンは、そのルーチン独自の情報と独自の方法を使って文を再構成するためです (例えば矢印で結び付けた画像として表示したり、あるいは定冠詞を使用しない言語を使ったりするなど)。この例のコンテキストでは、冠詞、前置詞、接続詞などには何の役割もありません。
同じようにして、roget='xxx" などの属性を追加することもできます。
リスト 5. 別の属性の追加
<section id='3' hr='jumped'
wnssid='v01963942'
roget='309'>jump16</section>
|
上記のコードでは、Roget の Thesaurus (シソーラス) の曖昧性が除去されたコンテンツをマシンが使用できるようにしています。そのコンテンツとは、具体的には「leap」の概念を単独で掘り下げている、項目 309 ですが、Roget の別の場所には「jump」の項目もあります。さらに、コンテキストにおいて関連するウィキペディアへのリンクなどを追加して、読者が後で情報を引き出せるようにするという方法で読者に配慮することもできます。
確かに XML は、曖昧性を除去したテキストを保管して、さまざまな読者を対象にテキストを組み立て直すためのツールとして使用することはできますが、それは大変な作業になりそうです。最近の文書で、曖昧性を除去して表現されている文書はほとんど皆無なので、即座に曖昧性を除去する手段が見つからなければ、誰かが XML で曖昧性を除去する作業に尽力しなければなりません。その作業は、現時点では完了に至るまでかなりの道のりがあります。
けれども、テキスト全体の曖昧性を除去する必要はないかもしれません。つまり、すべてを代表した抽象表現をするだけで十分だということです。その場合、曖昧性を除去した抽象表現で検索を実行することにより、大抵は正確な結果セットを得られます。しかも、(抽象表現がテキストよりも短いことを前提として) より多くの文書をより短時間で検索できるため、コストは大幅に減り、使用する電力も比較的少なくなります。このような曖昧性除去の手法を使用している単純な検索エンジンの一例としては、DAMSEL を調べてみてください (リンクについては「参考文献」を参照)。
しかし、こうした曖昧性除去をする価値はあるのでしょうか?例えば、「cow water buffalo」と指定することで、ある程度までは、複合語を使って曖昧性を抑えた検索を提示することはできますが、あとはこれらの単語が表す概念が、テキストの作成者が元々表現した概念と同じであることを祈るのみです。その一方で、作成者がタイ語で曖昧性を除去しないで文書を作成したとすると、検索は遥かに困難になります。
人間はその能力の 10% しか使ってないと言われています。マシンをこれと同じ運命に縛り付けなければならない理由は何もありません。
学ぶために
- WordNet: 英語の語彙データベースである WordNet の詳細を学んでください。
- 「Thinking XML: Querying WordNet as XML」(Uche Ogbuji 著、developerWorks、2005年1月): XML でより汎用の WordNet アプリケーションを構築するための第一歩として、WordNet 2.0 を XML 文書としてクエリーするためのコードを学んでください。
- 「XML的思索 第6回: ナレッジ管理のための基本的なXMLおよびRDF技法」(Uche Ogbuji 著、developerWorks、2001年11月): WordNet の同義語セットを組み込んで、RDF アプリケーションに意味的知識を追加する方法を学んでください。
- DisAMbiguated Search Engine (DAMSEL): この記事の著者が提供している曖昧性を除去した検索エンジンの例を調べてください。
- developerWorks の XML エリア: XML 分野でのスキルを磨くための資料を入手してください。
- My developerWorks: developerWorks のエクスペリエンスを自分流にカスタマイズしてください。
- IBM XML 認定: XML や関連技術の IBM 認定技術者になる方法について調べてください。
- XML technical library: 広範な技術に関する記事とヒント、チュートリアル、標準、そして IBM Redbooks については、developerWorks XML ゾーンを参照してください。
- developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。
- Twitter での developerWorks: 今すぐ登録して developerWorks のツイートをフォローしてください。
- developerWorks podcasts: ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
製品や技術を入手するために
- IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。
議論するために
- XML ゾーンのディスカッション・フォーラム: XML 関連のフォーラムに参加してください。
- developerWorks blogs: これらのブログを調べて、ブログに参加してください。