スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【同じタグを付けた記事の一覧】

tatoeba.org のリンク化に SWI-Prolog で失敗した話

2015年05月10日(日)00時12分

tatoeba.org

tatoeba.org はユーザー参加型の多言語例文プロジェクトです。
ある言語で投稿された例文に対し、その言語を理解できる他言語話者が自国語に翻訳し、さらにその言語を理解できる他言語話者が…、という連鎖によって対訳例文集を作っていく仕組みとなっており、現時点ですでに膨大な量の対訳例文が集積されています。
これらの例文は「CC-BY」という極めて制限の小さいライセンスで公開されており、まとめてダウンロードすることも可能です(なお、一部の例文には音声も存在しますが、こちらについては「CC-BY」とは限りません)。

「sentences.csv」と「links.csv」

この tatoeba.org からダウンロード可能なファイルのうち、中心となるのは「sentences.csv」と「links.csv」の二つです。
これらはいずれも、文字コードが「UTF-8(BOM 無し)」で改行コードが「LF」のタブ区切り CSV ファイルとなっています(といっても、「links.csv」は数字とタブと改行しか含まれていないため、実質的には単なる ASCII ファイルです)。

sentences.csv
全例文情報が「例文番号 - 言語名 - 例文」の三項目形式で格納されており、ここから tatoeba.org で公開されている全例文と、その言語種が取得可能です。
links.csv
それぞれの対訳関係が「例文番号 - 訳の例文番号」の二項目で格納されており、それぞれの例文について、同じ意味を持つ他の例文を確認できます。

「links.csv」

これら二つのファイルのうち、今回の話のネタとなるのは「links.csv」の方です。
ということで、まずはこの「links.csv」の内容をもう少し詳しく見ていきます。
一行目は「1 [tab] 77」となっており、これは「例文:1」と「例文:77」が対訳関係にある、ということです。
二行目は「1 [tab] 1276」で、ここから「例文:1」と「例文:1276」も対訳関係にあるということがわかります。
以下、このような状態のリンク関係の記述が延々と 8,262,024 行も続きます。
また、「例文:1」と「例文:2481」が対訳関係にある場合、「1 [tab] 2481」とも「2481 [tab] 1」とも表現できるわけですが、これは両者ともに記載されているようです。
ただし、これが仕様として絶対確実であるかは未確認なので、もしかしたら片方しか記載のない組合せもあるかもしれません。

不完全リンク

で、この「links.csv」から取得可能な対訳関係について追ってみたところ、どうも「関係するすべてのリンクを網羅しているわけではない」ようなのです。
規則・法則はよくわかりません。
ただ、対訳関係をつたっていけばたどり着けるはずの二つの例文が、リンクとして記録されていない場合がある、ということです。

完全リンク

と、ここで思いついたが Prolog です。
例えば「対訳関係」を「兄弟関係」と置き換え、「指定した一人の兄弟関係を再帰的にたどり、全ての血縁者をリストアップせよ」などとすれば、これはもう「Prolog の教科書に載せるために今わざわざ作ったのではないか?」と疑われても仕方がないぐらいに Prolog 的な問題となります。
そこで、この「tatoeba.org の完全リンク化」処理を SWI-Prolog で実装してみよう、というのが今回の内容です。

csv_read_file

ということで、まずはタブ区切りの CSV ファイルを読み込む方法を探してみたところ、「csv_read_file」という述語が見つかりました。
この述語は拡張ライブラリのものであるため、本来であれば「:- use_module(library(csv)).」で事前に読み込んでおく必要があるのですが、以前「Mery(テキストエディタ)で Prolog ソースコードの色分け表示」でも少しふれた「autoload」の対象であるため、設定を変えたりしていなければ、いきなり書いても使えます。
さらにいろいろと調べて、「links.csv」を読み込むための次のような文を作りました。

csv_read_file('links.csv',Rows,[separator(0'\t),functor(link),arity(2)]),maplist(assert,Rows).

のちの自分のために、以下に詳細な説明を残しておきます。

'links.csv'
「csv_read_file」の第一引数はファイル名です。
フルパス指定する場合のパス区切り記号は「\」は「\\」と二重にする必要があります。
Rows
「csv_read_file」の第二引数には結果が返ります。
結果は一行一項目のリストとなっており、例えば「links.csv」の冒頭部分三行のみを読み込んだ場合、「Rows = [link(1, 77), link(1, 1276), link(1, 2481)].」のようになります。
[separator(0'\t),functor(link),arity(2)]
「csv_read_file」の第三引数はオプションをリスト形式で指定します。
separator(0'\t)
「csv_read_file」オプションの一つ目で、区切り文字をタブに設定しています。
未指定時の標準は「カンマ区切り」ですが、ファイルの拡張子が「.tsv」であれば、これを指定せずとも「タブ区切り」で読み込まれるらしいです。
functor(link)
「csv_read_file」オプションの二つ目で、生成される文字列の「関数子(functor)」を設定しています。
未指定時の標準は「row」で、これを指定しない場合、第二引数「Rows」に返されるリストは「[row(1, 77), row(1, 1276), row(1, 2481)]」のようになります。
arity(2)
「csv_read_file」オプションの三つ目で、各行に存在する項目数が「2」であることを指定しています。
不正な行が無いことが明らかなデータであれば不要ですが、念のために指定しています。
指定しておいた場合、数が合わない行があると「domain_error(row_arity(Expected), Found)」が発行されるらしいです。
maplist
第二引数で指定されたリストの各項目に対し、第一引数で指定された述語を順に適用していく述語です。
assert
指定された文字列を節としてプログラム領域に追加します。
第二引数「Rows」の内容である「[link(1, 77), link(1, 1276), link(1, 2481)]」が順に追加されていきますので、結果的に「link(1, 77). link(1, 1276). link(1, 2481).」と書かれたデータベース的な Prolog ソースコードを読み込んだのと同じ状態になります。

実験は成功

まずはここまでがうまくいくかを確認しようと思ったのですが、なにしろ「links.csv」は 118MB(8,262,024 行)もある巨大ファイルであるため、時間がかかることが容易に予測できます。
なので、とりあえず冒頭の数十行だけを切り出した実験用ファイルを作って試してみた結果、要求通りに動作することが確認できました。
「link(1,X).」と尋ねれば、「X = 77; X = 1276; X = 2481; …」と答えが得られます。
実験は成功です。

本番は失敗

ということで、次は本番です。
時間がかかることは予想していましたが、30分経っても終わらず、1時間以上放置してやっと表示されたのが以下のエラーメッセージでした…。

ERROR: Out of global stack

どうやらワークメモリが足りなくなった、ということのようです。

計画中止

このワークメモリですが、標準では32ビット版が 128Mb、64ビット版が 256Mb となっているようです。
自分の使っている Portable 版の SWI-Prolog は32ビットなので 128Mb になります。
読み込む「links.csv」は前述のとおり 118MB ですから、付随する管理用のデータ領域等が加わると、まあ足りなくなるのも無理はありません。
64ビット版であれば標準でも足りそうな気はしますし、述語「set_prolog_stack/2」で拡張もできるようです。
しかし、「読み込みだけでも1時間以上かかる」ということを考えると、その先の処理はもう、とても実用的な時間内で終わるようには思えなかったため、今回のこの計画はここで中止することとしました。

関連記事

【同じタグを付けた記事の一覧】
プログラミング Prolog 語学学習

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
106位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
11位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。