wikipediaから、「よみがな」と「類義」、「英語の読み」とかを取得するプログラムを作りました。(辞書データもあるよ)

wikipediaのデータから、「よみがな」と「類義」、「英語の読み」、「キャラの読み」、「カテゴリ一覧」を取得するプログラムを作りました。(誰も作ってくれないし、案件流れて暇なので。。。)
ご自由にお使いください。(NYSL)


「よみがな」は、漢字混じりのページ名から、ページ内に書かれているよみがなを何とかして特定します。
「類義」は、リダイレクトや曖昧さの解決と、ページ内の項目とか本文から、なんとかして類義と思われるものを特定します。
「英語の読み」は、全部カタカナのタイトルから単語、全部英単語のタイトルから読みをなんとかして特定して表示します。日本人好みの読みができます。(例:こーふぃー、じゃなくてコーヒー)
「キャラの読み」は、架空のキャラクターのよみがなです。wikipediaだとページ内に埋もれているので掘り起こします。(高町なのは->たかまちなのは)
「カテゴリ一覧」は、ページにあるカテゴリだけを並べて表記します。

ソースコード

ご自由にお使いください(ライセンス:NYSL)。
ひたすら地道にパースしてます。
開発環境 windows7 64bit VS2010 (Linuxでも動きます。)
https://github.com/rti7743/wiki2dic

データフォーマット

みんな大好きtsvフォーマットです。
文字コードは、windowsならばディフォルトのSJISになります。
Linux環境ならばディフォルトのUTF-8になります。

yomiの場合
読み[TAB]タイトル
読み[TAB]タイトル
読み[TAB]タイトル
フジコフジオエー	藤子不二雄A
フジコエフフジオ	藤子・F・不二雄
ダイガクイン	大学院
エジソン	エジソン
トーマスエジソン	トーマス・エジソン
ホンゴウカマト	本郷かまと
ス	酢
ディープパープル	ディープ・パープル
レッドツェッペリン	レッド・ツェッペリン
フリー	フリー
クリーム	クリーム
ローリングストーンズ	ローリング・ストーンズ
レキシテキシリア	歴史的シリア
ヨシオカミホ	吉岡美穂
マイケルファラデー	マイケル・ファラデー
クラシック	クラシック
セルシウスド	セルシウス度
ナイター	ナイター
シュウキョウトカガク	宗教と科学

タイトルのよみがなを取得します。
左側がよみがなで、右側がタイトルです。
結構うまく動作していると思います。

ruigiの場合
タイトル[TAB]類義1[TAB]...類義N
タイトル[TAB]類義1[TAB]...類義N
タイトル[TAB]類義1[TAB]...類義N
動物命名法国際審議会	ICZN
三本杭	滑床山	滑床渓谷
VOICE MAGICIAN	ヴォイス・マジシャン
CAPTAIN HEDGE HOG	キャプヘジ	キャプテン・ヘッジ・ホッグ
石井豪	ごうさん	1415
FCシャフチョール・カラガンダ	Miners''	''Moles	シャフタール
両関酒造	両関
上坂すみれ	すみぺ	軍団長	スミーニャ	ウゲッチ
フットサル日本女子代表	なでしこ5
坂上村	坂上
南昌鉄路局	南局
シーダーラピッズ	5つの季節の都市
鎌倉三十三観音霊場	鎌倉三十三箇所
ガーデン・ステイト公園道路	ガーデン

タイトルとの類義語を出します。
一番左がタイトルで、以降が類義語っぽい項目です。
精度は、まだ微妙です。
たまに連想語、関連語辞書となっているところがあります。
出力時に、曖昧さの解決を消しています。そのために同じ名前なのが何個かあります。

engの場合
読み[TAB]単語
読み[TAB]単語
読み[TAB]単語
オープンビーエスディー	OpenBSD
コムソート	comb sort
デスラー	Desler
トリビアルファイルトランスファープロトコル	Trivial File Transfer Protocol
モナーフォント	Mona Font
パスカル	Pascal
オブジェクト	Object
トル	torr
リスト	list
ブートストラッププロトコル	Bootstrap Protocol
ゾフィー	Zoffy
ページランク	PageRank
アドビシステムズ	Adobe Systems
アンドリューカーネギー	Andrew Carnegie
リーフ	Leaf
アドビフォトショップ	Adobe Photoshop
アドビイラストレーター	Adobe Illustrator
オンドマルトノ	Ondes Martenot
ナノメートル	nanometre
モスク	Mosque

wikipediaのページから英語の日本人好みのよみがなをとります。(こぉっふぃーじゃなくて、コーヒーのように。)
左側がよみがなで、右が英単語です。
そこそこ読めていると思います。
出力時に、曖昧さの解決を消しています。そのために同じ名前なのが何個かあります。

charaの場合
読み[TAB]キャラ名[TAB]wikipediaのページ名[TAB]役者1[TAB]役者2[TAB]役者3
読み[TAB]キャラ名[TAB]wikipediaのページ名[TAB]役者1[TAB]役者2[TAB]役者3
読み[TAB]キャラ名[TAB]wikipediaのページ名[TAB]役者1[TAB]役者2[TAB]役者3
タカヤマハルカ	高山春香	桜Trick	戸松遥		
ソノダユウ	園田優	桜Trick	井口裕香		
ノダコトネ	野田コトネ	桜Trick	相坂優歌		
ミナミシズク	南しずく	桜Trick	五十嵐裕美		
イケノカエデ	池野楓	桜Trick	渕上舞		
イイヅカユズ	飯塚ゆず	桜Trick	戸田めぐみ		
サカイリナ	坂井理奈	桜Trick	遠藤ゆりか		
オトカワスミ	乙川澄	桜Trick	麻倉もも		
ニコラテスラ	ニコラ・テスラ	黄雷のガクトゥーン	古河徹人		
ネオンスカラスミリヤ	ネオン・スカラ・スミリヤ	黄雷のガクトゥーン	一色ヒカル		
ヴァルターリッツ	閃光	黄雷のガクトゥーン	ますおかゆうじ		
ベルタモリヴィーゲルト	ベルタ・モリ・ヴィーゲルト	黄雷のガクトゥーン	杉原茉莉		
エミリーデュシャトレ	エミリー・デュ・シャトレ	黄雷のガクトゥーン	かわしまりの		
ジョセフィンマーチ	ジョセフィン・マーチ	黄雷のガクトゥーン	野月まひる		
フロレンスアメギノナイチンゲール	フロレンス・アメギノ・ナイチンゲール	黄雷のガクトゥーン	桜川未央		
ウィルヘルムライヒ	ウィルヘルム・ライヒ	黄雷のガクトゥーン	山本兼平		
イズミ	イズミ	黄雷のガクトゥーン	柚木サチ		

wikipediaのなかに埋没しているキャラクターの情報から、よみがなを取ります。
左側がよみがな、次に、キャラクター名、ページタイトル、役者1、役者2、役者3となります。
役者とは、俳優や声優の情報です。
それっぽいものを見つけたら順番に追記していきます。
なぜ、3つもあるのかというと、アニメ版と実写版だったり、幼少期を別の人がやっていたり、海外ドラマの吹き替えなどがあるためです。
精度はそこそこ読めていると思います。ただ、役者情報についてはたまに間違っているのもあります。なるべく努力はしていますが、、、難しいところです。

categoryの場合
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
wikipediaのページ名[TAB]カテゴリ1...カテゴリN
松島松太郎	日本共産党の人物	東京都出身の人物	日本の国政選挙の立候補経験者	1915年生	2001年没	日本銀行の人物	日本の政治運動家
桜Trick	漫画作品	まんがタイムきらら	4コマ漫画	高等学校を舞台とした漫画作品	LGBT作品	アニメ作品	2014年のテレビアニメ	TBSの深夜アニメ	スタジオディーン	ポニーキャニオンのアニメ作品	4コマ漫画原作アニメ	芳文社の漫画を原作とするアニメ作品	高等学校を舞台としたアニメ作品	テレビアニメ連動データ放送	継続中の作品
信川虐殺事件	朝鮮戦争	黄海南道	歴史認識問題	朝鮮による大量虐殺	1950年の朝鮮民主主義人民共和国
ガレット郡	メリーランド州の郡	ガレット郡
安藤太郎	江戸幕府幕臣	幕府陸軍の人物	幕府海軍の人物	戦前日本の外交官	戦前日本の農林官僚	日本のプロテスタントの信者	日本の社会運動家	通訳	

ページに付けられたカテゴリタグを列挙します。
一番左がタイトルで、以降がページに付けられているカテゴリです。
単純なルーチンなので、ただありのままを出しています。

データ数

有効ページ総数:848,901件
ノートとかCategory、リダイレクト、曖昧さの解決等の内部ページを消した実質的な有効件数です。


読みが取れたページ:767,200件
よって、90%のページから読みが取れました。


類義:138,636件
よって、16%のページから類義語っぽいものが取れました。
すべてのページの項目に類義や略語があるわけじゃいですからね。


英語の読み:137,365件
こちらも同じくすべてのページが英語の読みではないためです。


読みが取れたキャラクター:288,836件
読みの是非に関係なくキャラクター総数:397,730件
よって、72%のキャラクターの読みが取れました。

遊び方

1.データのダウンロード

wikipediaからjawiki-latest-pages-metaをダウンロードしてきます。


wikipediaの公式サイトから jawiki-latest-pages-meta-current.xml.bz2 をダウンロードします。
http://dumps.wikimedia.org/jawiki/latest/
(ファイルは2GB、解凍すると16GBほどあります。)

2.プログラムをビルドします。

Windowsで、VS2010以降のC++11が使えるコンパイラ入れて、ビルドしてwiki2dic.exe を作ります。
or
Linux入れてC++11が使える環境を作って、 make して wiki2dic を作ります。

3.プログラムを実行して辞書を作ります。
読みがほしい時 (標準出力に出るので 適当にリダイレクトしてください)
wiki2dic.exe yomi jawiki-latest-pages-meta.xml  >_yomi.txt

類義がほしい時 (標準出力に出るので 適当にリダイレクトしてください。 前処理中にデバッグstderr出力がでます。)
wiki2dic.exe ruigi jawiki-latest-pages-meta.xml   >_ruigi.txt

英語の読み方リストを作りたいとき(標準出力に出るので 適当にリダイレクトしてください)
wiki2dic.exe eng jawiki-latest-pages-meta.xml   >_eng.txt

キャラの読み(標準出力に出るので 適当にリダイレクトしてください)
wiki2dic.chara chara jawiki-latest-pages-meta.xml   >_chara.txt

カテゴリ一覧(標準出力に出るので 適当にリダイレクトしてください)
wiki2dic.chara category jawiki-latest-pages-meta.xml   >_category.txt

よみがなを取れないのがほしいとか、そういうのは、オプションでなんとかできるので、usage を御覧ください。

4.待ちます。

処理には、かなり時間がかかるので、うまい棒食べて、コーラでも飲んでお待ちください。
開発するために、これだけのうまい棒を買いました。


買いましょう。


5.完成したら喜びの舞を踊ります。

窓を開けて、片足を上げて荒ぶる鷹のポーズを取りながら、wikiってゆーなと、叫びます。

 ヘ○ヘ  wikiってゆーな
  |∧
  /

ビルドするとかめんどい

こちらに 2014/10/10 のデータで作成したものがあります。
http://rtilabs.rti-giken.jp/files/2014_10_29/wiki/


データのライセンスは、データ元のwikipedia利用規約(GFDLとクエイティブ・コモンズ(CC-BY-SA)のデュアル)に準じます。
詳しくは、ズィン某にでも聞いてね。


おまけ

英語の発音辞書の cmudictから読みを取得するルーチンがおまけにあります。
ただ、日本人好みの英語の読み(taxiたっくすぃ、じゃなくてタクシー)にするのは結構大変です。
まだまだ誤読が多いです。

wiki2dic.exe cmudict cmudict.0.7a > _cmudict
インターロック	@INTERLOCK	IH2 N T ER0 L AA1 K
インターロックド	@INTERLOCKED	IH2 N T ER0 L AA1 K D
インターロッキング	@INTERLOCKING	IH1 N T ER0 L AA2 K IH0 NG
インターロッキュター	@INTERLOCUTOR	IH2 N T ER0 L AA1 K Y AH0 T ER0
インターロッキュターズ	@INTERLOCUTORS	IH2 N T ER0 L AA1 K Y AH0 T ER0 Z
インターローパー	@INTERLOPER	IH1 N T ER0 L OW2 P ER0
インターローパーズ	@INTERLOPERS	IH1 N T ER0 L OW2 P ER0 Z
インターリュード	@INTERLUDE	IH1 N T ER0 L UW2 D
インターリュードズ	@INTERLUDES	IH1 N T ER0 L UW2 D Z
インターマグネッティク	@INTERMAGNETIC	IH2 N T ER0 M AE0 G N EH1 T IH0 K
インターマグネッティクス	@INTERMAGNETICS	IH2 N T ER0 M AE0 G N EH1 T IH0 K S

精度は、一部ではそこそこですが全体的に見ると、まだアホです。
面白い誤読をしてくれるので見てて楽しいです。


cmudict本体は公式から追加ダウンロードしてね。
http://www.speech.cs.cmu.edu/cgi-bin/cmudict


↓にある cmudict.0.7a というファイルです。
http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/


cmudictのデータから生成するのが面倒な人のために、こちらに生成済みのデータがあります。
cmudictのライセンスと同様のもので利用してください。
http://rtilabs.rti-giken.jp/files/2014_10_29/cmudict/



バグを見つけた場合

@super_rti まで修正パッチと一緒に連絡ください。
メールでもいいのよ( rti@rti-giken.jp ) 。


どんなにやっても、100%確実に正しいのを作るのは結構大変です。
多少の間違いは妥協しましょう。
データはTSV形式なので、お手持ちのツールで加工してください。

usage

wikipedia to dic    2014 rti
--usage--
wiki2dic yomi|ruigi|eng|chara|category filename  [option]

Ex.
wiki2dic yomi jawiki-latest-pages.xml
  読みを取得します。
  出力形式は、 読み[TAB]タイトル[ENTER] です。

wiki2dic ruigi jawiki-latest-pages.xml
  類義語を取得します。
  出力形式は、 タイトル[TAB]類義...[ENTER] です。

wiki2dic eng jawiki-latest-pages.xml
  wikipediaの読みと英語単語から、英単語の日本語読みを取ります。
  出力形式は、 読み[TAB]単語[ENTER] です。

wiki2dic chara jawiki-latest-pages.xml
  wikipediaから架空のキャラクターたちの読みを取得します。
  出力形式は、 読み[TAB]キャラ名[TAB]タイトル[TAB]役者1[TAB]役者2[TAB]役者3[ENTER] です。

wiki2dic category jawiki-latest-pages.xml
  wikipediaからページのカテゴリータグだけを抜き出して列挙します。
  出力形式は、 タイトル[TAB]カテゴリ...[ENTER] です。

--wikipediaデータ--
 http://dumps.wikimedia.org/jawiki/latest/ から
 jawiki-latest-pages-meta-current.xml.bz2 をDLして展開すること

--option--
--case	よみがな文字列の変換
	--case=kata	[ディフォルト]カタカナに変換して出力
	--case=kana	ひらがなに変換して出力
	--case=none	何もしない。取れたままを出力
--show	表示項目
	--show=noempty	[ディフォルト]読めたものだけ表示する
	--show=all	全部表示する
	--show=empty	読めたものだけ表示する
--aimai	曖昧さの解決の()
	--aimai=del	[ディフォルト]消す
	--aimai=keep	消さない

--おまけ--(試験的なルーチンです)
wiki2dic cmudict cmudict.0.7a
  英語の発音辞書から強引に日本語読みに変換します。
  出力形式は、 読み[TAB]タイトル[ENTER] です。
--cmudictデータ--
 http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/ から
 cmudict.0.7a をDLすること

アルゴリズム

すべてのアルゴリズムは、ページ内の文章をひたすら地道にパースしています。
wikipediaはフォーマットが全く全然これっぽっちも規格化されていないので、ひたすら力押しに解決しています。とても泥臭いことをやっています。
数学とかは難しいのでまったくでてきません。正規表現もないです。
ただ文字との戦いだけです。


あらゆるパティーンを想定したプログラムを作って、一番うまく出来たのを採用する、そんなパターンマッチみたいなことを延々とやっています。
100%は目指すと時間の無駄なので、8割取れるのを目指しています。

yomi

wikipediaの読みフォーマットは、整備されていません。結構表記の揺れがあります。
それをなんとかして解析してそれっぽいのを取ってきています。


冒頭の {{Infobox または、 {{ 内とかその他いろいろに 読みっぽいカラムがあれば取得する。 (例: | よみがな = やまだたろう)
本文のタイトル表記のあとに(読み)ってぽいのが書かれていたら取得する。(例: 山田太郎(やまだたろう) )
省略表記があれば、がんばって結合する。(例: やまだ太郎(-たろう) 山田たろう(やまだ-) )
作者の名前表記が揺れた場合もそこを何とかして追跡する。
詳しくはソースコードを参照してください。

ruigi

2段階処理をします。
1段階目は、リダイレクト転送と、曖昧さ解決をすべて記録します。
2段階目に、ページ内から愛称とかの類を引っ張って、1段階目の奴とマージして、表示します。

愛称や略称もまったく規格化されていないので、 {{Infobox とか、ページ本文とかを使い、なんとかして取ってきます。
ひたすら地道にやっています。
誤爆をいかに避けながら、それっぽいのを拾うかです。
ソースコードを見ばわかりますが、一番苦労しているルーチンです。
略称を指していそうな文章をあたりをつけて、前と後ろから、それっぽい所を切り取っています。係り受け解析などありませんので、そこは気合でカバーします。

eng

yomiのアルゴリズムに近いです。
カタカナだけのタイトルのページを見て、そこから英単語っぽいのを拾います。
逆に英単語だけのページを見て、そこから読みを取ります。
誤爆をさせるために、先頭バイトのチェックのアルファベットの確認とか、いろいろがんばってます。

英単語を書くときのフォーマットも、まったくぜんぜん統一されていませんので、lang:、 英語、英、その他いろいろなどありとあらゆるパターンを試して、誤爆チェックルーチンで評価して、一番よさ気なものを採用しています。
ソースコードをみればいいけど、wikipediaの規格のゆるさに加え、ロシア語やスペイン語との誤爆、win/linuxのUTF16<->マルチバイト変換ライブラリのスペイン語変換ミス、和製英語に英語ではない舶来品(珈琲とか)などと、さまざまな地雷を全力で踏みながら、前に進んでいます。

chara

wikipediaは、キャラ名の項目は最悪です。
有名な架空のキャラクターは専門のページが作られますが、それ以外は、XXXの登場人物などのページにまとめられたり、作品のページに登場人物の紹介として書いてあったりします。
また、その書き方にしても、フォーマットが統一されていません。
気合と根性で掘り起こしています。
データが有るだけマシだと思うしか無いですね。
(例えば、主題歌とかはデータはあれどよみがなが全然降られていないので、よみがなが多少は降られている登場人物のほうがまだましだといえるでしょう。データフォーマットは統一されていませんが。実にもったいないところです。)

ソースコードをみれば、わかるかもしれませんが、登場人物を書くフォーマットは、; で書く普通のパティーン、 === キャラ名 === (===*3から===*5まであり)で書く愛が深いパティーン、||でテーブルレイアウトするDeep Loveティーン、 * で箇条書きするお気軽パティーン、 ;で箇条書きするひねくれ者パティーン、それ以外イミワカンナイにわかれます。
また、キャラ専用のページがなぜか許されているパティーンもあります。wikipediaはよくわかりませんね。
ただ、データ量だけみれば日本最大ですので、規格化されていないのが実にもったいないところです。

category

ページ内に有るカテゴリー表記を横に並べているだけです。それだけです。特に何もやっていません。
デバッグ中に暇だったので余興で作りました。
ソースコードもすっかすかです。
ただし、無意味なカテゴリは変換しています。"建築物 あ行" -> "建築物"などとまとめています。

cmudict

変換テーブル王に俺はなる。(ソースコード)

FAQ

処理に時間がかかりすぎます。

性能はディスクとCPUに依存します。
うまい棒食べて、コーラを飲んでお待ちください。


遅すぎてもう耐えられない。

基本的にディスクとCPU性能に依存します。
SSDを載せましょう。それが終わったら早いCPUを載せましょう。
それでもダメなら風呂入って寝ましょう。朝には終わってます。

ノートPCが焼けそうです。

窓を開けるか、扇風機で冷やしましょう。


WindowsLinuxで作られるデータが違いませんか?

Windows(SJIS)とLinux(UTF-8)の違いでTOFUになる文字が変わるためです。
また、内部処理の都合で一度UTF16に変換しているところでも、スペイン語などのワードの変換ミスが各処理系ごとに生じるため、完全に一致には至っていません。
なるべく同じになるように調整はしましたが、限度があります。

なぜcppなのに関数ベースで書いているのですか?

classって書くのがめんどくさかったからです。

キャベツ太郎ではだめですか?


きなこ棒もおいしいよ。
他にもいろいろあるので大人買いしましょう。

一言

アンサイクロペディアもふりがなふれよ。厨二ぽい二つ名を。