Wikipedia Prologの再構成とデータベース登録

5月ごろに、それまでのwikipedia prologのフォーマット上の問題が見つかって、その訂正を一旦保留していたが、先週から数日かけて、全て作り直した。

prolog宣言文の数は、17,843,495個あり544個のファイルに分割されている。データサイズは合計11.3Gバイトだ。

前にも書いたが、たとえば、いくつかのキーワードを持った宣言文をprologで拾い出そうとすると、一つのファイルの1秒かかる。使えない。そこで、一つ一つの宣言文が含むキーワード(名詞や動詞句など、二分木の葉になっているもの)を宣言文のIDとともにデータベース(mariadb)に登録した。そうすると、intersectコマンドを使って、キーワードを同時に持つ宣言文を拾い出せる。

マルチスレッドを利用することを前提に、mariadbのテーブルを25個に分けた。25個のスレッド(java)で、たとえば人間とロボットというキーワードを持つ宣言文を検索させると1秒以下で、すべてのwikipedia本文から、700余の文章(宣言文のID)を拾い出す。凄まじい速さだ。データベースの凄さだ。(indexを張っておかないといけない)

同時に持った宣言文のIDを拾いだしたら、その宣言文自体が欲しい。そこで、宣言文IDと宣言文そのものを、これまた25個のテーブルにデータベース化した。

そこで、人間とロボットというキーワードを持つ宣言文IDを検索し、それを元に宣言文そのものを取り出すためにかかった時間は、1.7秒だ。宣言文IDをつかって、ベタのファイルからその宣言文を取り出そうとすると、これほど高速にはならない。1.7秒は使える範囲だ。

だいぶ環境は整ってきた。

 

ubuntu18.04のファイアウォール設定

core-i9 ubuntu18.04マシンに、ファイアウォールを設定しようと思って、iptableを探したが見当たらない。ubuntuは、ufwというシステムを使うらしい。頭が古くなっているのを実感する。

sudo ufw allow 80/tcp

こんな感じで設定する。拒否するときは、

sudo ufw deny 3306

と言う感じ。IPアドレスをしていするときは、

sudo ufw allow from 192.168.0.1 to any port 3306

と言う感じ。有効にするときは、

sudo ufw enable

sshでリモートから接続しているときに、sshポートを開けないままやると、以後繋げなくなってしまうので注意しなさいと言うメッセージが出る。いかにもありそうな失敗だ。

無効にするときは、

sudo ufw disable

状態を確認したいときは、

sudo ufw status

長めに出力したいときは、

sudo ufw status verbose

となる。リロードするときは、

sudo ufw reload

ルールを削除したいときは、一旦ルールを番号で出す。

sudo ufw status numbered

番号を指定して削除する。たとえば、

sudo ufw delete 3

とか。

iptableよりも、はるかに使いやすいのは確かだ。

 

Core-i9をvncでmacからつなぐ

Core-i9 (ubuntu18.04)でやる作業が多くなったので、macから、VNCでつなぐことにした。

いろいろ調べて、vncのセットアップファイル、.vnc/xstartupを次のようにした。

#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

#日本語入力メソッド iBus
export GTK_IM_MODULE=ibus
export XMODIFIERS="@im=ibus"
export QT_IM_MODULE=ibus
ibus-daemon -d -x

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &

export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
/usr/bin/startlxde

ウィンドウマネージャーは、Lxdeという軽量のものにして、それだけでは、日本語入力がうまく行かないので、中程にある設定を入れている。どこかのサイトから頂いている。

Prolog化したWikipediaファイルのjavaによる検索時間

prologのfact文にしたwikipediaファイルを検索するためのjavaプログラムを作成した。prologによる開発効率が悪いので、あっさりjavaで、という狙いだった。プログラム自体は簡単にできた。ただ、じっさいそれで、「ロボット」と「模型」といった、2語を同時に含む文章を検索させると、1ファイルあたり7.8秒かかる。wikipedia本文の全部を544ファイルにしてあるうちの1ファイルにこれくらいの時間がかかるということだ。

prologにしてあるからで、元々のテキストから検索すれば、もっと早いのではないかと思われるかもしれない。単純な検索ならば、もっと早くなる可能性がないとは言えないが、prologのfact化してあるものは、そこにjuman++によるカテゴリ、品詞データ、ドメインなどの形態素解析やknpによる構文解析結果がはめ込まれているので、それらを含めれば比べ物にならない。つまり、元々のテキストに、こうした自然言語解析をやりながら、データの検索をかければ、もっと時間がかかってしまうだろうということだ。

もちろん、googleなどは、もっと上手いことをやっているんだろうが、それほどの環境やシステム、能力を持っていない。

となると、prolog化したwikipediaは、キホ的なところは、prologで検索しなければならないと思われる。

swiprologは、プログラム/データをバイナリ化して保持するので、自分の思う通りの検索をやらせれば、もっともっと速かった。

prologというもののすごさがわかる。

KNPエラー (null): can't open JUMAN.grammar

新しくMacBook (MacOS 10.14.6)にjuman++とknpをいれた。MacProでは、普通に使っていたので、問題なくインストールできるかと思った。ただ、昔のことでよく覚えていない。

juman++は、

./configure --prefix=/usr/local/jumanpp
make
sudo make install

で入れて、knpは、

./configure --prefix=/usr/local/knp --with-juman-prefix=/usr/local/jumanpp
make
sudo make install

でいれた。

echo 今日はいい天気ですね | /usr/local/jumanpp/bin/jumanpp | /usr/local/knp/bin/knp

をやると、

(null): can't open JUMAN.grammar .
exit(2)

となる。およ!どうなってるの。いろいろやったが、結局、jumanを別にインストールして、knpのコンパイル時に、

./configure --prefix=/usr/local/knp --with-juman-prefix=/usr/local/juman

とjumanppではなくjumanのインストール先を指定したら、

echo 今日はいい天気ですね | /usr/local/jumanpp/bin/jumanpp | /usr/local/knp/bin/knp 

# S-ID:1 KNP:4.19-CF1.1 DATE:2019/08/21 SCORE:-19.04210
今日は─────┐ <体言><NE:DATE:今日>
  いい─────┤ <用言:形><格解析結果:ガ/天気;カラ/-;時間/-;ガ2/->
    天気ですね<体言><用言:判><格解析結果:ガ/-;時間/今日>
EOS

とちゃんとjuman++ で結果を出した。ただ、これでよかったのかどうかはわからない。juman++だけでいいのかもしれない。とうめんこれでやる。

またおんなじことを繰り返さないようにメモしておく。

Prologはサーバーに徹する

2ヶ月、空白があった。理由は、戦略的な行き詰まりがあったからだ。煮詰まったと言ってもいい。原因は、Prologで全てをやろうとしたからだった。Prologは、開発効率がひどく悪い言語だと言うことを思い知った。その理由は、頭に描いたアルゴリズムのうち、JavaとかC++では簡単にやれることが、Prologは、超難しくなることだ。もちろん、一方で、Prologで非常にうまいこと処理できるものがある。個々を区別せず、やたらPrologでやろうとした。時間の浪費に消耗してしまった。

空白を置くことによって、冷静になれたと思う。空白期間中は、かつて熱心にやっていた電子書籍の作成システムを、汎用に作り直していた。(興味があれば、ネット書房のサイトをみてください)

話を元に戻すと、そういうわけで、今後はPrologは、言語的知識を表現することに徹する。それを取り出す上では、Prologでサーバーまでは組み立てる。与えられた要素を持った知識を取り出すサーバーをPrologで組み立てる。クライアントは、JavaでもC++でもなんでもいいだろう。プロトコルさえ決めておけば。