日本語テキスト解析の辞書登録機能
点訳エンジンの辞書登録機能は、もしかしたら rbtn をそのまま出力するか「ラジオボタン」に置き換えるか、といったユーザーごとの用語のカスタマイズに使えるかも知れません。
関連 点字ディスプレイ出力における略語の日本語化 (29297)
http://sourceforge.jp/ticket/browse.php?group_id=4221&tid=29297
実装の方法としては、liblouis ベースの処理と日本語点訳の処理のどちらでも動くものを作るのか、日本語点訳に限定したものを作るのか、ということが検討課題と思います。
「読み上げ辞書」の「デフォルト」に登録された単語(パターン)を、日本語点訳エンジンにも適用してはどうか、というご提案をいただきました。
「読み上げ辞書」の「デフォルト」に登録された単語(パターン)を、日本語点訳エンジンにも適用する、という仕様について検討しています。
以下のような前提、制約がありそうです。
そのため、以下の仕様・制約を検討中です。
この作業の方針を再検討していましたが「読み上げ辞書」で文字列置換の前処理をするのではなく、 MeCab のユーザー辞書や部分解析などを使う方法が、以下の理由から、よりスマートに思えます。
関連チケット #32345
mecab のユーザー辞書に対応するとしたら、例えば以下のような実装が考えられます。
あるいは、ユーザー辞書をバイナリ化する機能を Web サービス化してもよいかも知れません。
参考 mecab 単語の追加方法
とりあえず miscdep に作業ブランチを作りました。
まず source/synthDrivers/jtalk/mecab.py の Mecab_initialize に何かオプションを与えると mecabrc の userdic = /home/foo/bar/foo.dic,/home/foo/bar2/usr.dic,/home/foo/bar3/bar.dic に相当する情報を与えられるようにするつもりです。
To ssh://git@bitbucket.org/nvdajp/nvdajpmiscdep.git * [new branch] ti29508 -> ti29508
mecabuser.csv に UTF-8 で
足手纏い,,,,名詞,形容動詞語幹,*,*,*,*,足手纏い,アシデマトイ,アシデマトイ,4/6,C1,アシデ マトイ
のように書いてコンパイルされたユーザー辞書が使われると mecabHarness.py のテストケースでいままで未対応だった
{'text':'足手纏い', 'braille':'アシデ マトイ'},
が正しく解析されることを確認できました。
まだ mecabrc にユーザー辞書のパスをハードコーディングしており、パスを動的に追加する処理を実装していません。
mecabライブラリの中でmecabrcの文字コードの扱いがどうなっているかわからないので、もしかするとユーザー設定ディレクトリのパスにマルチバイト文字が使われているとうまく初期化できない、といったことが起こるかも知れません。
To ssh://git@bitbucket.org/nvdajp/nvdajpmiscdep.git ad3a830..ffd6e8a ti29508 -> ti29508
miscdep の master に作業をマージしました。
To ssh://git@bitbucket.org/nvdajp/nvdajpmiscdep.git ad3a830..7162dd9 master -> master
以下のような仕様です。
NVDA 側のテストビルドはこれから行います。また、CSV ファイルをコンパイルするツールは NVDA 本体に組み込まないで、アドオンで提供しようと思っています。
jpbeta140217
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140217.exe
テスト用辞書ファイル
https://dl.dropboxusercontent.com/u/62564469/jtusr.dic
この jtusr.dic をユーザー設定フォルダ C:\Users\ユーザー名\AppData\Roaming\nvda にコピーして jpbeta140217 を実行すると、以下の文章の解析結果が変わることを確認しています。
足手纏い 誤り:あしてまとい 正解:あしでまとい
ただしポータブル版の場合はポータブル版の設定フォルダが参照されます。
実験のための辞書なので、現状ではこの1単語だけをコンパイルしています。
辞書コンパイルのためのアドオン(jtusrdic)のひな形を作りました。
ソースは下記:
https://bitbucket.org/nishimotz/nvdajtusrdic
とりあえず mecab-dict-index.exe を呼び出すだけの簡単なものを作るつもりです。
お問い合わせをいただいたので補足します。
ポータブル版のユーザー設定フォルダは、 c:\nvdajp にポータブル版を作ったとすると、 c:\nvdajp\userConfig になります。
つまり jtusr.dic を
c:\nvdajp\userConfig\jtusr.dic
にコピーすることになります。
ユーザーガイド 8.4. 設定プロファイルの保存場所
ポータブル版のNVDAは、すべての設定項目、 カスタムアプリケーションモジュール及びカスタムドライバーを、 NVDAディレクトリー内のuserConfigというディレクトリーに保存します。
http://www.nvda.jp/nvda2013.3jp/ja/userGuide.html#toc75
2014.1jp のリリースを遅らせないために、この作業はここまでで jpbranch にマージすることとして、辞書コンパイルはアドオンで対応させてください。
ユーザー辞書が使用されるときにログファイルに出力を出すように変更しました。
INFO - synthDrivers.jtalk.mecab.Mecab_initialize (18:47:50): dic: C:\Users\NISHIM~1\AppData\Local\Temp\nshDEF9.tmp\app\synthDrivers\jtalk\dic INFO - synthDrivers.jtalk.mecab.Mecab_initialize (18:47:50): mecab:0.996 nvdajp-jtalk-dic (utf-8) 20140218-093813 INFO - synthDrivers.jtalk.mecab.Mecab_initialize (18:47:50): user_dics: C:\Users\nishimotz\AppData\Roaming\nvda\jtusr.dic
なお Mecab がユーザー辞書のパスをカンマ区切りで受け取る仕様のため、ファイル名やディレクトリ名に半角カンマが含まれている場合は無視するようにしています。
jpbranch にマージしました。
NVDA日本語テスト版 jpbeta140218
https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140218.exe
チケットのコンポーネント種別を「点字ディスプレイ」から「テキスト解析」に変更しました。
概要を「日本語点訳エンジンの辞書登録機能」から「日本語テキスト解析の辞書登録機能」に変更します。
辞書コンパイル用アドオン jtusrdic 0.1 を作りました。
https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.1.nvda-addon
まだメニュー項目が英語だったり、ドキュメントがアドオンテンプレートのままですが、ご容赦ください。
ツールメニュー "Edit JTalk User Dic source"
ツールメニュー "Compile JTalk User Dic"
文字コードは UTF-8 でなくてはいけません。
以下、簡単に辞書ソースファイルの説明です。
やや難しいですが、NVDA日本語版でログ出力レベルを「デバッグ」にすると現在の辞書でのテキスト解析結果が出るので、参考にしていただけると思います。
足手纏い,,,,名詞,形容動詞語幹,*,*,*,*,足手纏い,アシデマトイ,アシデマトイ,4/6,C1,アシデ マトイ
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音,アクセント,アクセント結合規則,点字表記
「表層形」から「発音」までは下記「mecab:単語の追加方法」で説明されている。
上記の例の補足:
アクセント,アクセント結合規則 は Open JTalk の独自拡張である。
アクセントは "アクセントのあるモーラ位置/全体のモーラ数" で記述されている。
アクセント結合規則は下記のブログ記事に説明がある:
点字表記は NVDA 日本語版の独自拡張である。
点字表記は点字出力でのカナ表記と、半角スペースでマスアケの場所を指定する。
辞書ソースをテキストエディタで開きやすいように拡張子を csv ではなく txt に変更しました。
https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.2.nvda-addon
エディタ機能を独自に作ればいいのかも知れませんが、もう少し検討させてください。
アドオンが辞書のコンパイルに失敗する不具合について調べているのですが、 どうやら jtusr.dic がすでに mecab に読み込まれている状態で、 読み込まれたファイルを上書きしようとするとパーミッションエラーになるようです。
設計を見直したいと思います。
ERROR - unhandled exception (13:30:48): Traceback (most recent call last): File "userConfig\addons\jtusrdic\globalPlugins\jtusrdic\__init__.py", line 51, in compileUserDic ret = mecabDictIndex['-d', jtalkDir.dic_dir, '-u', u, '-f', 'utf-8', '-t', 'utf-8', s]() File "userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 90, in __call__ return self.run(args, **kwargs)[1] File "userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 203, in run return p.run() File "userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 166, in runner return run_proc(p, retcode, timeout) File "userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\processes.py", line 208, in run_proc stdout, stderr) ProcessExecutionError: Command line: ['C:\\work\\nvda\\nvdajp\\source\\userConfig\\addons\\jtusrdic\\globalPlugins\\jtusrdic\\mecab-dict-index.exe', '-d', 'C:\\work\\nvda\\nvdajp\\source\\synthDrivers\\jtalk\\dic', '-u', 'C:\\work\\nvda\\nvdajp\\source\\userConfig\\jtusr.dic', '-f', 'utf-8', '-t', 'utf-8', 'C:\\work\\nvda\\nvdajp\\source\\userConfig\\jtusr.txt'] Exit code: -1 Stdout: | reading C:\work\nvda\nvdajp\source\userConfig\jtusr.txt ... 1 | emitting double-array: 100% |###########################################| Stderr: | dictionary.cpp(324) [bofs] permission denied: C:\work\nvda\nvdajp\source\userConfig\jtusr.dic
NVDA 日本語ベータ版 jpbeta140221 https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140221.exe
辞書コンパイル用アドオン jtusrdic 0.3 https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.3.nvda-addon
mecab 初期化のときに、ユーザー辞書ファイルを一時ファイルにコピーして読み込むように変更しました。
辞書コンパイルアドオンでは、ユーザー辞書ファイルのひな形を BOM なしの UTF-8 (UTF-8N) で作成するように変更しました。
その他、バグ修正、エラーログの追加などを行いました。
なお、本家が NVDA 2014.1 リリース候補1 をリリースしたので、 日本語チームのリポジトリに jp2014.1 ブランチを作成しました。 このテスト版は jp2014.1 ブランチからビルドされています。
辞書コンパイル用アドオン jtusrdic 0.4
https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.4.nvda-addon
"Edit JTalk User Dic source" で作成または編集された jtusr.txt が BOM つきの UTF-8 であっても、"Compile JTalk User Dic" を実行したときに BOM なしの UTF-8N に変換してから辞書コンパイルするようにしました。
辞書コンパイル用アドオン jtusrdic 0.5
https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.5.nvda-addon
コンパイルした辞書が userConfig に書き込まれない不具合を修正しました。
Windows XP SP3 では以下のように問題が起きていることを確認しました。
インストール環境:no source found でコンパイルができない。
INFO - external:globalPlugins.jtusrdic.compileUserDic (21:08:54): system_dic "C:\Program Files\NVDA\synthDrivers\jtalk\dic" INFO - external:globalPlugins.jtusrdic.compileUserDic (21:08:54): configDir "C:\Documents and Settings\nishimotz\Application Data\nvda"
ポータブル環境:辞書コンパイルで下記のエラーが発生する。
INFO - __main__ (21:11:24): Starting NVDA INFO - core.main (21:11:24): Config dir: C:\nvdajp\userConfig INFO - core.main (21:11:25): NVDA version jpbeta140221 INFO - core.main (21:11:25): Using Windows version sys.getwindowsversion(major=5, minor=1, build=2600, platform=2, service_pack='Service Pack 3') INFO - core.main (21:11:25): Using Python version 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] INFO - core.main (21:11:25): Using comtypes version 0.6.2 INFO - synthDrivers.jtalk.mecab.Mecab_initialize (21:11:30): dic: C:\nvdajp\synthDrivers\jtalk\dic INFO - synthDrivers.jtalk.mecab.Mecab_initialize (21:11:30): mecab:0.996 nvdajp-jtalk-dic (utf-8) 20140221-060434 INFO - synthDrivers.jtalk.jtalkDriver.initialize (21:11:30): loaded C:\nvdajp\synthDrivers\jtalk\mei\mei_normal.htsvoice INFO - synthDrivers.jtalk.jtalkDriver.initialize (21:11:30): loaded C:\nvdajp\synthDrivers\jtalk\lite\voice.htsvoice INFO - synthDriverHandler.setSynth (21:11:30): Loaded synthDriver nvdajp_jtalk INFO - core.main (21:11:30): Using wx version 2.8.12.1 (msw-unicode) INFO - braille.initialize (21:11:30): Using liblouis version 2.5.3 INFO - braille.BrailleHandler.setDisplayByName (21:11:30): Loaded braille display driver noBraille, current display has 0 cells. INFO - brailleInput.initialize (21:11:30): Braille input initialized WARNING - core.main (21:11:31): UIA not available INFO - core.main (21:11:31): NVDA initialized INFO - config.ConfigManager.save (21:11:33): Base configuration saved INFO - external:globalPlugins.jtusrdic.compileUserDic (21:11:51): system_dic "C:\nvdajp\synthDrivers\jtalk\dic" INFO - external:globalPlugins.jtusrdic.compileUserDic (21:11:51): configDir "C:\nvdajp\userConfig" INFO - external:globalPlugins.jtusrdic.compileUserDic (21:11:51): user_dic C:\DOCUME~1\NISHIM~1\LOCALS~1\Temp\tmpkjmn33\jtusr.txt to C:\nvdajp\userConfig\jtusr.dic ERROR - unhandled exception (21:11:51): Traceback (most recent call last): File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\__init__.py", line 51, in compileUserDic File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 90, in __call__ File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 202, in run File "contextlib.pyo", line 17, in __enter__ File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 159, in bgrun File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\commands\base.py", line 220, in popen File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\machines\local.py", line 100, in popen File "C:\nvdajp\userConfig\addons\jtusrdic\globalPlugins\jtusrdic\plumbum\machines\local.py", line 246, in _popen File "subprocess.pyo", line 709, in __init__ File "subprocess.pyo", line 957, in _execute_child WindowsError: [Error 193] %1 は有効な Win32 アプリケーションではありません。
このエラーはコマンドプロンプトから mecab-dict-index.exe を実行したときにもダイアログで表示され、プロンプト画面には「アクセスが拒否されました」と表示される。
辞書コンパイル用アドオン jtusrdic 0.6
https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.6.nvda-addon
Windows XP で動くように mecab-dict-index をコンパイルしました。
ただし Visual C++ 再頒布可能パッケージ vcredist_x86.exe をインストールする必要があるかも知れません。
Visual Studio 2013 の Visual C++ 再頒布可能パッケージ http://www.microsoft.com/ja-jp/download/details.aspx?id=40784
バージョン 0.6 でビルドした mecab-dict-index.exe ですが dumpbin /dependents しても VC ランタイムのDLL依存性が出てこないので、ランタイムをインストールしなくてもよさそうな気がします。
いちおう /MT オプションを付けてビルドするというのもやってみたのですが、違いがなさそうです。
c:\work\nvda\bb\jtusrdic>dumpbin /dependents addon\globalPlugins\jtusrdic\mecab-dict-index.exe Microsoft (R) COFF/PE Dumper Version 12.00.21005.1 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file addon\globalPlugins\jtusrdic\mecab-dict-index.exe File Type: EXECUTABLE IMAGE Image has the following dependencies: KERNEL32.dll Summary 5000 .data D000 .rdata 4000 .reloc 3F000 .text
辞書コンパイル用アドオン jtusrdic 0.7 https://dl.dropboxusercontent.com/u/62564469/jtusrdic-0.7.nvda-addon
辞書ソースを新規作成した直後にコンパイルできない不具合を修正しました。
細かいところですが、仕様の変更を検討しています:
現在の仕様:
最終の仕様案:
複数のユーザー辞書バイナリを併用される可能性を考慮していたのですが、意図しないファイルが mecab に読み込まれて誤動作するリスクがあるので、ユーザー辞書バイナリをひとつに限定したほうがよさそうに思えてきました。
「足手纏い」をシステム辞書に登録して、下記を jtusr.txt のテンプレートにする予定です:
次世代型点字ピンディスプレイ,,,,名詞,一般,*,*,*,*,次世代型点字ピンディスプレイ,ジセダイガタテンジピンディスプレイ,ジセダイガタテンジピンディスプレイ,12/16,C0,ジセダイガタ テンジピンディスプレイ
nvdajpmiscdep: [master 64c1f3f] work regarding ti31543 7 files changed, 35 insertions(+), 9 deletions(-)
複数辞書ファイルから jtusr.dic ファイル固定とする仕様変更は終わっています。
辞書コンパイル用アドオンを完成させるまでの残った作業はチケット #33324 で扱います。
本チケットは NVDA 日本語版の本体に関する作業として、完了とします。
nvda-japanese-users 856 で下記のご提案がありました。
点字出力でのユーザー辞書登録を 簡単にできるようにしていただけると 有難いです。
現在では音声辞書の登録は出来ても 点字での辞書登録は出来ないのですね?
現在でも他のスクリーンリーダーと比べても NVDAの点字辞書は優れていると思います。
それだけに 固有名詞のユーザー辞書登録が 簡単にできると 更にすばらしくなると思います。
例えば女性の名前の「久代」という単語が いつも点字で「クシロ」と出るのを直したい、 というようなことです。