2008/02/05

SPARQL - FILTER functions

SPARQLのFILTERに関する話.

などを参考にFILTERを試みる.

PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE {
  ?x dc:title ?title
  FILTER regex(?title, "web", "i" )
}

これはW3Cの解説クエリ例を引っ張ってきたものだが,通常のFILTERはこのように記述できる.
?titleは比較対象であり,webが含まれるものを抽出する.
第三引数の"i"は,case-insensitive(英語での大文字小文字の区別なし)を意味する.

比較対象がintであるならば,

FILTER (?price < 30.5)

このようにさらに単純になる.

--

しかしこの第二引数に日本語を入力するとどうしても比較できず,No Matchという何も抽出されない状況になって非常に困った.これは前々からできなくて何度も挫折してたんだが,今日は気合を入れて検索結果と睨めっこしまくった.

するとhttp://thefigtrees.net/lee/blog/2006/04/sparql_calendar_demo_retrievin.htmlで,


FILTER regex(str(?g_wrapped), str(?g))

こんな表記を発見した.
よくわからないけど,比較対象をstrでくくっていたので,同様にしてみたところなんと解決.
しっかりとフィルタリングされた.


× FILTER ( regex(?s_relate, "年金問題","i"))
○ FILTER ( regex(str(?s_relate), "年金問題","i"))


たったこの違いである.
はじめは日本語だからフィルタがかからないのかと思ったけど,そうじゃないのかもしれない.
多分strでくくることで,その対象がstring型だと指定しているのかな.

でもそうすると,
FILTER regex(?title, "web", "i" )

これは?ってことになる. うーん.


とりあえずこの発見はメチャクチャ大きい.よっしゃああああ!(叫)


[キーワード]SPARQL,FILTER,regex,RDF,OWL

RAPで文字化け

RAPにオントロジーを噛ませると特定の文字のみ化ける.
解決できず(>_<)

とりあえず今のところ文字化けする漢字は以下.

"一"
"通"
"倍"
"瀬"
"言"

ぽたモバ: 文字化けでは,”通””一””瀬”が化けると書かれていて同じような状況.
しかしこのエントリーは,E61での文字化けなので違うのかな.

救いの手求む.

2008/01/31

PHPとMeCabでオートリンクの実装をする2

PHPとMeCabでオートリンクの実装をする の続きエントリー.

上ではMeCabを用いてオートリンクを行う仕組みを作ったので,これをPHPで使うのがこのエントリーの目的.

まず,ウノウではPHPのMecab拡張モジュールを用いている.
ただ俺はPHPからコマンドプロンプトに処理を投げる方式を用いる.
利用する関数はshell_execです.

ポイントはコマンドプロンプトから入力したコマンド
mecab -d.
にある.
このコマンドのドットがカレントディレクトリを指しているので,PHPから利用する場合は絶対パス指定をしてやればOK.

つまり
mecab -d "C:\Program Files\MeCab\dic\autolink"
と同義であるということ.

これを踏まえて簡単なPHPで実装する.

<?php
  echo mecab("京都に行きたいな");

  function mecab($input){
    $mecab = '"C:\Program Files\MeCab\bin\mecab.exe"';
    $mecab2 = '"C:\Program Files\MeCab\dic\autolink"';
    $str= shell_exec('echo '.$input.' '.$mecab." -d ".$mecab2);
    return $str;
  }
?>

で実装ができる.
ソースは適宜変更するべし.

以上.

PHPとMeCabでオートリンクの実装をする

ウノウラボ
PHPとMecabでキーワード自動リンクを実装する(以下,ウノウ)
を参照して,PHPとMeCabを用いたオートリンクの実装をWindowsで試みる.

知識不足のせいでいろいろ戸惑った箇所があったので,俺のようなダメ院生でも理解できるように書く.アドバイスを頂いた研究室の先輩には大感謝.

------

MeCabインストールに関しては割愛.
今回俺は C:\Program Files\MeCab にインストールをした.

-----

自動リンク用辞書の作成
ここはウノウを参照して同じものを作成する.

  • 単語辞書(url.csv)
  • 連接表(matrix.def)
  • 未知語の文字定義(char.def)
  • 未知語用品詞定義(unk.def)
  • 設定ファイル(dicrc)
設定ファイル(dicrc)を普通に作ると.txtになるので注意.
拡張子はありません.
俺は C:\Program Files\MeCab\dic\ipadic の中のdicrcをコピーして中を書き換えた.
もしくは,コマンドプロンプトから C:\Program Files\MeCab\dic\autolink>ren dicrc.txt dicrc とリネームしてもOK.

-----

さて,これらのファイルを用いて辞書のコンパイルを行う.
ウノウの例を見てみると1行目に
# /usr/libexec/mecab/mecab-dict-index -f utf-8 -c utf-8
とある.正直意味不明だった.
この例はLinuxで行ってるため,今回のようにWindowsで行う場合は以下の方法を試す.

まず,1行目にあるmecab-dict-indexに注目する.
C:\Program Files\MeCab\bin の中にmecab-dict-index.exeがあることを確認して欲しい.
他にはmecab.exeなどもある.

ここで確認しておく.
MeCabを使うためのPATHは通してあるだろうか?
俺のインストール先を例にするならば c:\program files\mecab\bin とPATHを通す.
これ必須.

試しにプロンプトでmecab-dict-indexと入力してみる.

C:\>mecab-dict-index
'mecab-dict-index' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。


と出るのであれば,PATHが通ってない.
コマンドプロンプトを立ち上げたり,PATHを見直してみることをお薦めする.

C:\>mecab-dict-index
dictionary_compiler.cpp(70) [param.load(DCONF(DICRC))] no such file or directory: .\dicrc

と表示されるならOKである.

ということで,コンパイルをはじめる.
今回作成したautolinkフォルダまでカレントディレクトリを移動させる.
そこで,以下のコマンドを使用.

C:\Program Files\MeCab\dic\autolink>mecab-dict-index -f shuft-jis -c shuft-jis
エンコードは適宜
C:\Program Files\MeCab\dic\autolink>mecab-dict-index -f UTF-8 -c UTF-8
のように変更すること.

すると何かぐちゃぐちゃと表示された後,最後に「done!」と表示されれば成功だ.
autolinkフォルダのファイルが増えていることを確認しよう.

--

コンパイルに成功したところで,さっそく使ってみる.
コマンドは
C:\Program Files\MeCab\dic\autolink>mecab -d .
である.
その後待機状態になるので入力文を入力する.

C:\Program Files\MeCab\dic\autolink>mecab -d.
京都でムフフなことしたいどすえ
京都でムフフなことしたいどすえ


大成功である.
ちなみに mecab -d . のドットはカレントディレクトリを指すので重要.
ゴミと思って入力し忘れないように.


MeCabを用いたオートリンクの実装に成功した.
ウノウの例では,PHPのMeCab拡張モジュールを用いてPHPの実装を行っているが,今回はコマンドプロンプトを直接介して処理を行う.

これに関しては以下の別エントリーで解説します.
PHPとMeCabでオートリンクの実装をする2

--

参考リンク
http://labs.unoh.net/2008/01/keyword-autolink-using-php-and-mecab.html
http://mecab.sourceforge.net/dic-detail.html
http://d.hatena.ne.jp/tokushiman/20071024/1198588473
http://ratti.kachoufuugetu.net/diary/diary_archive/0710.html(10/25(10/25)の記事

2008/01/22

RDFGravityに投げてみた

今日は他研究室の先輩に研究のお話をして頂いた.
大変貴重なお話や提案をして頂き,研究が一歩前進したと思う.
ありがとうございました.

--
今構築しているオントロジーをRDF Gravity(RDFファイル可視化ツールのようなもの)に投げてみたら凄いことになった笑