ChaSen, KAKASI で日本語ページ名の読みを取得†
- ページ: BugTrack
- 投稿者: 三浦克介
- 優先順位: 普通
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2003-07-30 (水) 10:00:45
- バージョン:
メッセージ†
以前どこかで、話題に上がっていましたが、一覧表示で日本語のページ名が「日本語」でひとくくりになってしまうのは、良い仕様とは言いがたい。ChaSen や KAKASI の漢字→仮名変換機能を利用して、日本語ページ名の読みを取得し、一覧表示の五十音順分類やls2などの整列に役立ててはどうか。
開発談義 でとりあえずα版を上げてみたのですが、そこそこ需要がありそうですので、BugTrack にて正式提案させていただきます。開発は、私の方で進めております。完成し、問題が無いようであれば、本家合流お願いします。
主な仕様、実装のアイデアは、
- ページ名と読みの対応表を記述したページ(デフォルト=:config/PageReading)を作成
- この対応表を見て、ページを分類・整列
- 対応表にエントリーが無い場合は、ChaSenまたはKAKASIを通して、読みを取得
- ChaSen、KAKASIで取得した読みは、対応表に追加
- 通常は、対応表を参照するだけなので、それほど重くならない(はず)
- ChaSenやKAKASIが読みを間違えた場合も、あとから手動でページを編集して修正が可能
- ChaSenやKAKASIがインストールされていないシステムが多い(特にレンタルサーバーの場合)と思われるので、デフォルトでは機能をOFFにしておき、従来と同じ動作
開発中のテストWeb(現在、β1版) テスト終了
- いくつか、仕様の面で迷っている点が・・・、 -- 三浦克介
- 対応表のページ名はコロン付き (:PageReading) にしておくべき?
- プラグインは決めたんですけど、本体系をここで決めてしまえば良いんだろうと思います。個人的には、:config/pukiwiki/hogehoge とか、:config/hogehoge で良いんじゃないかと思います。誰かが、こうだ!と決めれば、まぁ、それで良いとは思いますけどね。-- upk
- では、本体機能関係は :config/hogehoge ってことで (って、私が決めちゃって良いのかな?)、:config/PageReading にしておきましょうか。 -- 三浦克介
- 「ゴ」とかで始まるページ名は「コ」に分類されるべき?「ゴ」と「コ」は別?
- ページ名の最初の1文字を取得するのに、mb_ereg を使っているのですが、preg_match でなんとかならないか?(mb_ereg を使うと、mbstring の無いシステムで動作しない)
- 逆に、mb_ereg が本家で使われていないのが大丈夫なの?という気が・・・。単語検索を行う際、preg_match を使って、パターンを工夫することで、EUC の2バイト目と次の文字の1バイト目を1文字の漢字と誤認するのを避けているようですが、BugTrack/296 の中で話題になっていたように、現状では、「壁」などの文字を検索した際、2バイト目と1バイト目にマッチして誤動作することがあるようです。これって、mb_ereg を使えば回避できるでは?と思うのですが・・・(試していませんけど)。
- mb_eregがPHP4.1.2で使えれば…
- これってEUC-JP onlyでしょうか? PukiWikiをUTF-8化してる場合もOK? -- reimy
- 現在のα1版では、何も考えずに実装してるので、多分 EUC じゃないとダメでしょう。ちゃんとコード指定 or 変換して Chasen, KAKASI を呼び出せば大丈夫なので、そのように実装しておきます。 -- 三浦克介
- 両ソフト共に、EXEはあるようなので、Windows環境も考慮して下さいよぉ... というか、私も気にしておきますね。-- upk
- ChaSen対応する際に、対応するんでしょうけど、プラットフォーム依存しているのと、/tmp が使えるというコーディングは、ちょっとまずいですね。get_readings()の tempnam() と、popen()。まぁ、/usr/local/bin に入るとも限らないわけですし、C:\USR\BIN\ とかの Windows でもよいわけですし。今後に期待しております。 -- upk
- seimei.inc.php に入っている SeimeiKakulist() で漢字の画数が求まるので、画数表も面白いかなぁ?なんて。そんなことはないなぁ。やっぱり。-- upk
- KAKASI は、かなり古い段階 (少なくともver.2.3.4 2001/9/7 以前) から、入力コードの自動判別、入出力コードの指定が可能なようです。一方、ChaSen の方は、最新版 ver.2.3.1 (2003/6/19) で、入力コードの指定が可能になったようです。それ以前のバージョンでは、UNIX 用は EUC、Windows 用は SJIS 固定のようです。結局の所、古い ChaSen に対応するためには、PukiWiki の側でコード変換してやる必要があるようです。pukiwiki.ini.php で、ChaSen/KAKASI に送るコード EUC/SJIS を指定するようにし、プラットフォームに応じて切り替える形にしておきます。 -- 三浦克介
- 一応、基本的な所は押さえましたので、β1版としてアップしておきます。Win系の方は、pukiwiki.ini.php の設定を適宜書き替えて下さい。$pagereading_enable = 1; にしないと、有効になりませんので、ご注意ください。ChaSenもOKです。テンポラリファイルは、./cache/ に作るようにしました。何か問題ありましたら、ご指摘下さい。 -- 三浦克介
- Windows環境(IIS)では、まだうまく動かせていません。ソースを切り出して、CLI環境で動かすと、問題なく、kakasi の稼動結果が戻るんですけど、IIS環境下で稼動させると、kakasi の実行結果は、空となっています。というのが現状です。これは、popen() だからとかではなく、system() で実行させファイルにリダイレクトしても空です。でも、CLIだとpopen()で問題なく動いているんですよねぇ。かと言って、テンポラリなファイル(ページ名の一覧)は、ちゃんと出力できているので、アクセス権でも無さそうです。うーむ... -- upk
- あと、Windows における PHP(v4.3.1) の挙動として、tempnam() の CACHE_DIR は、有効になっていないようです。C:\WINDOWS\Temp に書き出しています。IISがいかんのだろうけど... でも、windir(SystemRoot) の Temp に置きたがるところから、IISが稼動しているユーザと何か関連していることは間違いないんですけどね。-- upk
- テンポラリファイルの場所は、まーどこでもいいんですが、KAKASIの出力が空なのは謎ですねぇ・・・。 -- 三浦克介
- 嫌らしいんですけど、Windows Update して、色々と最新版になってしまったら、知らないうちに、動いていました。原因は不明です。困った... なお、PHPなどは一切、変更していません。ということで、WindowsXP+IIS でも問題なく稼動しました。と報告しておきます。-- upk
- PukiWiki 1.4.7+Apache 2.2.8+PHP 5.2.6.で同様の症状が出ていました。apacheのログファイルには"C:\Program: No such file or directory"と表示されておりテンポラリファイルへのパスに空白文字が入っているため読み取れないことが原因のようでした。file.phpの572,608行目の realpath(CACHE_DIR) としているところを空白文字が入らないよう C: のようにしたところ動作しました。 -- moerrari 2010-12-26
- 動作報告:Windows2000,Apache1.3.27,PHP4.2.3dev で問題なく動作しています。 -- nao-pon
- MeCab対応にすると UTF8 でもうまく動くんじゃないのかなぁ? -- merlin
- 試してみましたが、英字を扱う際のハンドリングが異なるので、ちょっと厳しいような気がしますね。まぁ、先頭1文字だぁ。と決め付けるんなら、構わないのでしょうけどね。-- upk
- そおかぁ 英字の部分は Chasenと同じって書いてあったけどいろいろ違うんですね。 -- merlin
- 簡単にしかテストしていない状況ですが、英字の読みは戻ってこなかったんで、こりゃなぁ。ってところですよ。-- upk
- 最近のバージョンのchasen(+ ipadic)だと-F%yでANK文字が削除されてしまいます. ちょっと変更してみたのですがいかがでしょうか(全角英数字を半角にしたのはわたしの好み)? -- よっちい
--- func.php.orig Sun Nov 16 21:17:22 2003
+++ func.php Wed Nov 26 23:13:58 2003
@@ -314,7 +314,10 @@
$str .= "</li>";
if($pagereading_enable) {
- if(mb_ereg('^([A-Za-zァ-ヶ]),$readings[$page],$matches)) {
+ if(mb_ereg('^([A-Za-z])',mb_convert_kana($page,"a"),$matches)) {
+ $head = $matches[1];
+ }
+ elseif(mb_ereg('^([ァ-ヶ])',$readings[$page],$matches)) {
$head = $matches[1];
}
elseif (mb_ereg('^[ -~]|[^ぁ-ん亜-熙]',$page)) {
- 動作報告です。MacOSX(10.2.8および10.3.1)で動作しました。標準ではいってるPHPではmb_regex_encoding()を呼ぶところでとまっていたので、PHPをenthropy.chで配布しているものに入れ替えれば動作しました。ChaSenはこちらのパッケージを利用しました。 -- bebebe
- upkさんと同じく、Windows環境(IIS6)でpopenが動かなかった(CLIだと動くがWeb経由で動かない)者です。kakasiでなくmecabになりますが、対処としてC:\Windows\system32\cmd.exeの実行権限を該当のWebアクセスユーザに与えたところ、動くようになりましたのでご報告します。 -- goto
- この方法でうまくいきました!環境は XP IIS 5.1 + FastCGI + PHP5 です。 -- お世話になっております