本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

XML的思索 第6回: ナレッジ管理のための基本的なXMLおよびRDF技法

その3: 意味体系からの知識

Uche Ogbuji (uche@ogbuji.net), Consultant, Fourthought, Inc.
Uche photo
Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。

概要: シリーズ第3回目の今回のコラムでは、WordNetの同義語セットを取り込むことでRDFアプリケーションに意味論的知識を追加する方法を紹介します。WordNetの語いデータベースによって追加された知識を利用することで、一度に1つのキーワードだけを検索するのではなく、関連する概念をRDFデータの集合から検索することができます。デモ用の 問題追跡機能アプリケーションで示されているように、「vote」、「choice」、「ballot」、およびその他の86個の関連語を個別に検索しなくても、「selection」の概念に適合する実例を1回だけ検索すれば済みます。コラムニストUche Ogbujiが、この技法を紹介するサンプル・コードをPythonで作成しています。

日付:  2001年 11月 01日
レベル:  中級 この記事の原文:  英語
アクティビティー: 2682 ビュー
お気軽にご意見・ご感想をお寄せください: 


これまでのコラムではXMLアプリケーションからRDFにデータを抽出する基本的な技法の概要を示したので、今回はこの抽出の結果を有効に利用する方法へと進むことにします。前の2回の記事をまだお読みでない場合は、この記事を読む前に目を通してください (右側の「関連dWコンテンツ」の欄にあるリンクを参照してください)。

デモ・アプリケーションは、XML形式の問題データを管理する問題追跡機能です。前回までは、このデータからRDFを抽出する技法と、生成されたRDFモデルを照会する基本的な技法について見てきました。今回は、このような作業にどのような価値があるのかを示す1つの例を詳しく見ることにします。

WordNetとは

WordNetは、Princeton大学で行われているプロジェクトです。「英語用語いデータベース (a lexical database for the English language)」とも呼ばれるWordNetは、同義語の集合を同義語セット またはsynset と呼ばれるグループにまとめることで、単語と概念の記述および分類を行うシステムです。これは、どれほど賞賛してもしきれないほど重要な長期プロジェクトであり、非常に優れた研究成果が得られています。さらに、事実上すべての開発者が利用できるオープン性が、WordNetを一層重要なものにしています。WordNetのライセンスは「無制限」です。実質的な制限はWordNetの派生物のプロモーションにおいてPrinceton大学の商標を不正に流用してはならないということだけである点で、WordNetはBSDのライセンスとよく似ています。

知的労働の重要な成果を公益のために自由に利用できることは、常にすばらしいことであると言わなければなりません。昨今、公共の知識を勝手に利用して怪しげな利益を得ようとし、見返りのない貢献による還元を拒むような企業の話を、あまりにも多く耳にします。

WordNetは現在バージョン1.7になっており、数万の名詞を表すsynsetの用語集が含まれています。synsetは、さまざまな概念 (hyponym を含む)、他の概念の種類を表す概念、およびサブクラス (hypernym はhyponymのスーパークラス) によって関連付けられています。WordNetには、同義語ではなくて類似している概念間のマッピングも含まれています。

Princeton大学は、WordNet自体を、さまざまなプラットフォーム用のデータ・ファイルとコマンド行照会ツールとして配布しています。多くのプロジェクトがWordNetをそれぞれの状況に合わせて拡張しており、特にRDFコミュニティーは、WordNetが適切に構成されたリソースのネットワークを表していることから、WordNetを積極的に採用してきました。関連するプロジェクトとしては、Dan BrickleyによるWeb対応WordNetや、Dr. Jonathan Bordenによるブラウズ可能なXHTML形式へのWordNetの適用などがあります。この記事では、Sergey MelnikとStefan Deckerの好意により、WordNetデータベースからRDFへの簡単な変換方法を使用します。2人とも、BrickleyやBordenと同様に、RDFコミュニティーの活動に多くの時間を割いています。ここで使用するMelnikとDeckerのRDF変換プログラムも含めて、紹介したプロジェクトの大部分では、WordNet 1.6がまだ使用されています。


WordNet/RDFのセットアップ

このコラムでは、RDFで強化された問題追跡機能にRDFツールとWordNet RDFモデルを使用して意味論的機能を追加する方法を紹介します。RDFツールは種類によって若干の違いがありますが、どのツールを使用してもかまいません。私は、自社のオープン・ソース製品である4Suiteに付属する4RDFを使用する予定です。RDF形式のWordNetは巨大であるため、4RDFの永続データベース・バックエンドを使って管理します。4RDFを利用すれば、モデルをメモリー内で (このシリーズでこれまで使用してきた方法です)、または永続ストレージを利用して (PostgreSQLやOracleなどのSQL DBMS、フラット・ファイル、または私が作成した実験的なカスタマイズ版RDFバックエンドであるMangroveなど)、管理できます。Mangroveは4Suiteの次回リリースである0.12.0で登場する予定ですが、この記事の公開時点では発表されていない可能性があるため、このコラムの例ではPostgreSQLを使用します。PostgreSQLは、企業で利用できる品質を備えたオープン・ソースのリレーショナルDBMSで、多くのLinuxディストリビューションおよび他のさまざまなプラットフォームに対するパッケージで提供されています。

セットアップを行うには、まず最初に、WordNet/RDFのファイルをダウンロードします。wordnet_hyponyms-20010201.rdfファイルでは、次の2個所を修正する必要があります。まず、58268行目です。

<rdf:Descripout="&a;103178459">

上の行を次のように変更します。

<rdf:Description rdf:about="&a;103178459">

もう1か所は109228行目です。

<b:hyponymOf rdf:resof 
rdf:resource="&a;105862019"/>

上の行を次のように変更します。

<b:hyponymOf rdf:resource="&a;105862019"/>

次に、名詞とhyponymのデータベースのWordNet RDFファイルを、PostgreSQLベースのsit (semantic issue trackerの頭文字) という名前のRDFモデルに追加します。


リスト1. sitという名前のデータベースRDFモデルへのWordNet RDFファイルの追加
                
$ 4rdf --driver=Postgres --dbName=sit wordnet_nouns-20010201.rdf 
$ 4rdf --driver=Postgres --dbName=sit wordnet_hyponyms-20010201.rdf

リスト1を見るとわかるように、Postgres ドライバーを指定する必要があり、ドライバーに対してはデータベース名を指定する必要があります。指定した名前のデータベースが存在していない場合は新しく作成され、存在している場合はそのファイルに生成されたステートメントが追加されます。

問題追跡機能に戻る前に、ここまでで作成されたWordNetモデルに対して簡単なテスト・スクリプトを実行してみましょう。


リスト2. WordNet RDFモデルを使用する簡単なテスト・プログラム (wn-test.py)
                
from Ft.Rdf.Drivers import Postgres
from Ft.Rdf import Model, Util
WN_RDF_BASE = "http://www.cogsci.princeton.edu/~wn/schema/"
def Test():
    db = Postgres.GetDb('wordnet')
    db.begin()
    m = Model.Model(db)
    print "Size of the model (number of statements): ", m.size()
    print "Synonyms of the word 'knowledge':"
    noun = Util.GetSubject(m, WN_RDF_BASE+'wordForm', 'knowledge')
    print Util.GetObjects(m, noun, WN_RDF_BASE+'wordForm')
    print "Classification chain for 'knowledge':"
    HypernymChain(noun, 'knowledge', m)
    db.rollback()
    return

def HypernymChain(noun, wform, m):
    hyper = Util.GetObject(m, noun, WN_RDF_BASE+'hyponymOf')
    if hyper:
        hwform = Util.GetObject(m, hyper, WN_RDF_BASE+'wordForm')
        print "%s is a kind of %s"%(wform, hwform)
        HypernymChain(hyper, hwform, m)
    return

if __name__ == "__main__":
    Test()

リスト2では、Postgres.GetDb('sit') を呼び出すことで、作成したRDFデータベース・バックエンドに接続しています。接続を確立した後、バックエンドに対するトランザクションを開始し、それを使ってモデル・オブジェクトをセットアップすれば、照会を実行できるようになります。最初に、モデル内のステートメントの数を表示します。次に、前回の記事で紹介した基本的なRDF照会を使用して、knowledge という単語の同義語を検索し、概念間における分類のチェーンをトレースしています。

WordNet/RDFでは、次の形式のURIを使って名詞のsynsetを表します。

http://www.cogsci.princeton.edu/~wn/concept#100001740

100001740 はsynsetのIDです。次に、synset内の同義語である各単語に対するwordForm ステートメントがあります。場合によっては、各synsetをスーパークラスに結び付けるhyponymOf ステートメントもあります。つまり、テスト・プログラムは、このスキーマに従う2つの簡単な照会を使用して同義語を取得します。HypernymChain は再帰的な関数で、synsetリソースおよび同義語の1つの単語形式を受け取って、hypernymを検索します。リストをwn-test.pyという名前のファイルに保存して実行すると、次のような結果になります。

$ python wn-test.py 
Size of the model (number of statements):  351632
Synonyms of the word 'knowledge':
['cognition', 'knowledge']
Classification chain for 'knowledge':
knowledge is a kind of psychological feature


問題追跡機能の語いレイヤー

前回の記事では、複数のXMLファイルを変換して直列化したRDFを抽出する方法、およびその後で結果をRDFプロセッサーに渡す方法を見ました。ここでは、WordNetステートメントを含む同じモデルにこれらのステートメントを追加します。

$ 4rdf --driver=Postgres --dbName=sit issues.rdf

ここでも、Postgres ドライバーおよび同じデータベース名を指定していますが、今度はissues.rdfファイルから読み取っています。このファイルには、サンプルの問題追跡機能ファイルから抽出されたメタデータが含まれています。

今度は、前に見たものと同じ照会に意味論機能が追加されたものを実行できます。たとえば、前回の記事で紹介した照会の例では、正規表現を使って、uogbuji に割り当てられたアクションのうち本体にvote という文字列を含むものをすべて検索しました。今度は、uogbuji に割り当てられたアクションから一般的な意味での選択 (selection) に関係するものをすべて検索してみます。何らかの文字列パターンを検索するのではなく、言語の認識レベルにおける真の語いパターンを検索します。vote だけでなく、choice やballot など、選択の意味を含む単語をすべて検索します。

リスト3は、検索を実行するプログラムです。


リスト3. WordNetを使って英語の意味論的概念で検索を実行するプログラム (seman-search.py)
                
from Ft.Rdf.Drivers import Postgres
from Ft.Rdf import Model, Util
from Ft.Rdf.Model import REGEX
USER_ID_BASE = 'http://users.rdfinference.org/ril/issue-tracker#'
IT_SCHEMA_BASE = 'http://xmlns.rdfinference.org/ril/issue-tracker#'
WN_RDF_BASE = "http://www.cogsci.princeton.edu/~wn/schema/"
g_relatedWords = []
def SemanSearch(word):
    db = Postgres.GetDb('wordnet')
    db.begin()
    model = Model.Model(db)
    #Find the synset resource of which we have the word form
    noun = Util.GetSubject(model, WN_RDF_BASE+'wordForm', word)
    print 'Actions assigned to uogbuji related to "%s":'%(word)
    #Get all word forms of this synset and its hyponyms
    HyponymWords(noun, model)
    #Combine all the words into one large regular expression
    pattern = ".*" + "|".join(g_relatedWords) + ".*"
    #Use this regex to search for the appopriate concepts
    actions = Util.GetSubjects(model, IT_SCHEMA_BASE+'body', pattern,
                               objectFlags=REGEX)
    #Iterate over the bodies of the matching actions
    for action in actions:
        #See if this action is assigned to uogbuji
        assignee = Util.GetObject(model, action, IT_SCHEMA_BASE+'assign-to')
        body = Util.GetObject(model, action, IT_SCHEMA_BASE+'body')
        if assignee == USER_ID_BASE+'uogbuji':
            print "*", body
    db.rollback()
    return

def HyponymWords(noun, model):
    words = Util.GetObjects(model, noun, WN_RDF_BASE+'wordForm')
    print "words", words
    g_relatedWords.extend(words)
    hypos = Util.GetSubjects(model, WN_RDF_BASE+'hyponymOf', noun)
    print "hypos", hypos
    for h in hypos:
        HyponymWords(h, model)
    return

if __name__ == "__main__":
    import sys
    SemanSearch(sys.argv[1])

リスト3では、SemanSearch がメインの関数です。まず、WordNetと問題追跡機能データで生成したRDFモデルにアクセスします。この関数は、引数として、概念検索のベースとなる単語を受け取ります。最初のステップは、単語をWordNetのsynsetリソースに変換することです。次に、このsynset内にある他のすべての単語形式 (同義語) およびhyponym synsetのすべての単語形式を、検索リストに追加します。例として、開始概念にselection を指定したときに収集される検索リストの結果は、リスト4に示すような89個の単語形式になります。


リスト4. selectionという単語に対する同義語とhyponymの検索結果
                
['choice', 'pick', 'selection', 'casting', 'sampling', 'random 
sampling', 'proportional sampling', 'representative sampling', 
'stratified sampling', 'conclusion', 'decision', 'determination', 
'appointment', 'assignment', 'designation', 'naming', 'nominating', 
'nomination', 'co-optation', 'co-option', 'delegacy', 'ordaining', 
'ordination', 'laying on of hands', 'call', 'move', 'demarche', 
'maneuver', 'maneuvering', 'manoeuvering', 'manoeuvre', 
'tactical maneuver', 'tactical manoeuver', 'parking', 'device', 
'gimmick', 'twist', 'fast one', 'trick', 'feint', 'gambit', 'ploy', 
'stratagem', 'artifice', 'ruse', 'measure', 'step', 'countermeasure', 
'countermine', 'porcupine provision', 'shark repellent', 'golden 
parachute', 'greenmail', 'pac-man strategy', 'poison pill', 'suicide 
pill', 'safe harbor', 'scorched-earth policy', 'casting lots', 'drawing 
lots', 'sortition', 'finding', 'finding of fact', 'verdict', 'compromise 
verdict', 'quotient verdict', 'directed verdict', 'false verdict', 
'general verdict', 'partial verdict', 'special verdict', 'conclusion 
of law', 'finding of law', 'volition', 'willing', 'election', 'co-optation', 
'co-option', 'ballot', 'balloting', 'vote', 'voting', 'secret ballot', 
'split ticket', 'straight ticket', 'multiple voting', 'casting vote', 
'veto', 'pocket veto']

プログラムは、この検索リストに含まれる単語に対する問題アクションのワン・パス検索を行うため、単語形式を1つの大きな正規表現にまとめます。前回のコラムで説明したように、結果として作成されるアクションのリストは、「uogbuji」に割り当てられているアクションへとさらに絞り込まれます。リスト3のプログラム (seman-search.py) を実行すると、結果は次のようになります。

$ python seman-search.py selection
Actions assigned to uogbuji related to "selection":
* Organize a vote on this topic

コマンド行で基本概念を渡すと (この場合はselection )、対応するアクションが出力されます。


いいことばかりではない

もちろん、この意味論的検索アプローチにも問題があります。最もよくわかるのはパフォーマンスです。WordNet/RDFグラフのサイズが大きいため、すべてを処理するには長い時間がかかります。検索の基本概念としてselection を使用した上記のサンプル・セッションの場合、PIII 1GHzのラップトップで実行すると2分よりかかり、ディスク上のDBMSには非常に大きな負荷がかかりました。要した時間の大部分は、hyponymチェーンの再帰的な降下に費やされています。thing のような抽象的な概念を検索した場合は、どれくらい長い時間マシンがハングするのか (そしてクラッシュしてしまうのではないかと) 考えると、恐ろしくなります。

問題の一部分は、前回のコラムと同じように、このサンプルがまだ力まかせの方法を使ってRDFモデルの照会を行っていることが原因です。最適化はまったく行われていません。この問題については、この後のシリーズでRDF Inference Language (RIL) を採り上げるときに対処します。ただし、最適化したとしても、このような強力な意味論的検索にはパフォーマンスに関する問題が付きまとうことでしょう。

パフォーマンスの問題の一部は、ポリシーを通して対処できます。抽象性が一定のレベルより高い検索を禁止することができます。抽象性の大まかな測定基準の1つとして、synsetから最も離れたhyponymまでの最長の距離を使用できます。処理時間の大部分はWordNetグラフ内を移動しながらの処理に費やされるので、解決策としてもう1つ考えられるのは、クローラーを使って関連する概念のリストを準備することにより、共通の検索を最適化することです。

もう1つの問題は、WordNetの作業がまだ完全ではないことです。一般に使われている名詞または名詞句はほとんどWordNetでマップされていますが、動詞や修飾詞または他の品詞はまだです。そのため、検索できる範囲は限定されます。また、WordNetは英語に関するプロジェクトなので、英語以外の言語で意味論的検索の機能を利用することはできません。欧州の言語に対するマッピングを開発するEuroWordNetの作業が行われてはいますが、まだ途中です。当然、東アジアや中東などの重要な言語グループについても、意味論的検索の機能はまだ利用できません。


まとめ

うれしいことに、RDFを利用した意味論的検索によって開かれる可能性のデモンストレーションに対しては大きな反響がありました。半構造化された関係やメタデータの管理の価値といった抽象的な概念を説明することは、ビジネスマンに対してだけでなく、開発者の多くに対してさえ容易なことではないので、このような反響は、啓発活動のはげみになります。RDF駆動の 問題追跡機能の細部を明らかにしながら、ナレッジ管理を利用したアプリケーションの改善に関するこの探究を続けていきます。ただし、次回は回り道をし、コラムの最初の方で採り上げた問題の最新情報について触れることにします。


参考文献

WordNet IBM参考文献

著者について

Uche photo

Uche Ogbuji氏は、Fourthought, Inc. のコンサルタント兼共同設立者です。この会社は、企業のナレッジ・マネジメントのためのXMLソリューションを専門とするソフトウェア・ベンダー兼コンサルタント会社です。Fourthoughtでは、XML、RDF、およびナレッジ・マネジメント・アプリケーション用のオープン・ソース・プラットフォームである4Suiteを開発しています。Ogbuji氏は、ナイジェリア出身のコンピューター・エンジニア兼ライターで、現在は、米国コロラド州ボールダーに住み、そこで働いています。Ogbuji氏の連絡先はuche.ogbuji@fourthought.com です。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=242302
ArticleTitle=XML的思索 第6回: ナレッジ管理のための基本的なXMLおよびRDF技法
publish-date=11012001
author1-email=uche@ogbuji.net
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。