OSDN Git Service

fixed reading of latin character words such as: japanese, mouse, one.
[nvdajp/nvdajpmiscdep.git] / include / jtalk / mecabRunner.py
1 # mecabRunner.py \r
2 # -*- coding: utf-8 -*-\r
3 # Japanese text processor test module\r
4 # by Takuya Nishimoto\r
5 \r
6 from __future__ import unicode_literals\r
7 import os\r
8 import sys\r
9 from mecab import *\r
10 \r
11 def __print(s):\r
12         print s.encode('cp932', 'ignore')\r
13 \r
14 buffer = ''\r
15 \r
16 def __print_dummy(s):\r
17         global buffer\r
18         buffer += s + '\n'\r
19 \r
20 def Mecab_get_reading(mf, CODE_=CODE):\r
21         reading = ''\r
22         braille = ''\r
23         for pos in xrange(0, mf.size):\r
24                 ar = Mecab_getFeature(mf, pos, CODE_=CODE_).split(',')\r
25                 rd = ''\r
26                 if len(ar) > 9:\r
27                         rd = ar[9].replace('\u3000', ' ')\r
28                 elif ar[0] != 'ー':\r
29                         rd = ar[0]\r
30                 reading += rd\r
31                 if len(ar) > 12:\r
32                         braille += ar[12] + r"/"\r
33                 else:\r
34                         braille += rd + r"/"\r
35         return (reading, braille.rstrip(r" /"))\r
36 \r
37 def get_reading(msg):\r
38         s = Mecab_text2mecab(msg)\r
39         mf = MecabFeatures()\r
40         Mecab_analysis(s, mf)\r
41         Mecab_correctFeatures(mf)\r
42         Mecab_print(mf, __print_dummy)\r
43         reading = Mecab_get_reading(mf)\r
44         mf = None\r
45         return reading\r
46 \r
47 # tasks: 要素2は音声合成の読み、(もしあれば)要素3は点訳用のカナ表記\r
48 # 点訳の表記と分かち書きは、規則で処理できないものを\r
49 # Mecab 辞書の第13フィールドに追加している。\r
50 # 要素3のスラッシュは形態素の区切り、スペースは形態素内のマスアケ\r
51 \r
52 # some examples from nvdajp-jtalk-dic:\r
53 # http://nvdajp-jtalk-dic.heroku.com/items/\r
54 tasks = [\r
55         ['あ⣿あ∫あ♪',  'アイチニーサンヨンゴーロクナナハチノテンアセキブンキゴーアオンプ'],\r
56         ['鈹噯呃瘂蹻脘鑱涿癃',  'ヒアイアクアキョーカンザンタクリュー'],\r
57         ['十五絡脈病証',  'ジューゴカラマミャクヤマイアカシ'],\r
58         ['マーク。まーく。',  'マーク。マーク。'],\r
59         ['1 2',  'イチ ニ'],\r
60         ['manage', 'マネイジ'],\r
61         ['choose', 'チュウズ'],\r
62         ['impaired', 'インペアド'],\r
63         ['failed', 'フェイルド'],\r
64         ['mixi', 'ミクシー'],\r
65         ['nullsoft', 'ヌルソフト'],\r
66         ['speech api', 'スピーチ エーピーアイ'],\r
67         ['use', 'ユース'],\r
68         ['echo', 'エコウ'],\r
69         ['you', 'ユー'],\r
70         ['youtube', 'ユーチューブ'],\r
71         ['files', 'ファイルズ'],\r
72         ['docs', 'ドックス'],\r
73         ['labs', 'ラブス'],\r
74         ['japan', 'ジャパン'],\r
75         ['japanese', 'ジャパニーズ'],\r
76         ['favorites', 'フェイバリッツ'],\r
77         ['documents', 'ドキュメンツ'],\r
78         ['settings', 'セッティングズ'],\r
79         ['one', 'ワン'],\r
80         #['onegai', 'オネーガイー'],\r
81         ['redistributable', 'リディストリビュータブル'],\r
82         ['app', 'アップ'],\r
83         ['types', 'タイプス'],\r
84         ['mouse', 'マウス'],\r
85         ['行',  'ギョー'],\r
86         ['一行', 'イチギョー'],\r
87         ['1行', 'イチギョー'],\r
88         ['1行下', 'イチギョーシタ'],\r
89         ['1行上', 'イチギョーウエ'],\r
90         ['2行', 'ニギョー'],\r
91         ['3行', 'サンギョー'],\r
92         ['現在行', 'ゲンザイギョー'],\r
93         ['最上行', 'サイジョーギョー'],\r
94         ['1行下',  'イチギョーシタ'],\r
95         ['1行上',  'イチギョーウエ'],\r
96         ['誤判定', 'ゴハンテイ'],\r
97         ['50音順', 'ゴジューオンジュン'],\r
98         ['税', 'ゼイ'],\r
99         ['三毛猫', 'ミケネコ'],\r
100         ['表計算', 'ヒョーケイサン'],\r
101         ['小文字', 'コモジ'],\r
102         ['大文字', 'オーモジ'],\r
103         ['拡張子', 'カクチョーシ'],\r
104         ['世界中', 'セカイジュー'],\r
105         ['孫正義', 'ソンマサヨシ'],\r
106         ['2分前', 'ニフンマエ'],\r
107         ['2分前', 'ニフンマエ'],\r
108         ['障がい', 'ショーガイ'],\r
109         ['親オブジェクト', 'オヤオブジェクト'],\r
110         ['z', 'ゼット'],\r
111         ['規', 'タダシ'],\r
112         ['全', 'ゼン'],\r
113         ['007', 'ゼロゼロナナ'],\r
114         ['上矢印', 'ウエヤジルシ'],\r
115         ['下矢印', 'シタヤジルシ'],\r
116         ['大見出し', 'オオミダシ'],\r
117         ['前景色', 'ゼンケイショク'],\r
118         ['梅雨前線', 'バイウゼンセン', 'バイウ ゼンセン'], \r
119         ['八ッ場ダム', 'ヤンバダム'],\r
120         ['1都5県', 'イットゴケン'],\r
121         ['1都5県', 'イットゴケン'],\r
122         ['1都6県', 'イットロッケン'],\r
123         ['1都6県', 'イットロッケン'],\r
124         ['孫正義', 'ソンマサヨシ', 'ソン マサヨシ'], \r
125         ['きゃりーぱみゅぱみゅ', 'キャリーパミュパミュ'],\r
126         ['いひ', 'イヒ'], # http://sourceforge.jp/ticket/browse.php?group_id=4221&tid=30919\r
127         ['金', 'キン' ],\r
128         ['1月', 'イチガツ', '1ガツ'], # NVDA点字表示の誤り No.18\r
129         ['為おおせる', 'シオオセル'], # 点訳のてびき第3版 第2章 その1 1 5 No.63\r
130         ['凡そ', 'オオヨソ'], # 点訳のてびき第3版 第2章 その1 1 5 No.67\r
131         ['無花果', 'イチジク'], # 点訳のてびき第3版 第2章 その1 1 6 No.3\r
132         ['砂利道', 'ジャリミチ'], # 点訳のてびき第3版 第2章 その1 1 6 No.10\r
133         ['少しずつ', 'スコシズツ'], # 点訳のてびき第3版 第2章 その1 1 6 No.20\r
134         ['鼓', 'ツヅミ'], # 点訳のてびき第3版 第2章 その1 1 6 No.32\r
135         ['葛籠', 'ツヅラ'], # 地名? 点訳のてびき第3版 第2章 その1 1 6 No.33\r
136         ['紅提灯', 'ベニヂョーチン'], # 点訳のてびき第3版 第2章 その1 1 6 No.39\r
137         ['まづ', 'マズ'], # 点訳のてびき第3版 第2章 その1 1 7 No.1\r
138         ['一つづつ', 'ヒトツズツ'], # 点訳のてびき第3版 第2章 その1 1 7 No.2\r
139         ['大きう', 'オオキュー'], # 点訳のてびき第3版 第2章 その1 1 7 No.5\r
140         ['うれしう', 'ウレシュー'], # 点訳のてびき第3版 第2章 その1 1 7 No.6\r
141         ['もみぢ', 'モミジ'], # 点訳のてびき第3版 第2章 その1 1 7 No.7\r
142         ['みづうみ', 'ミズウミ'], # 点訳のてびき第3版 第2章 その1 1 7 No.8\r
143         ['ヴァイオリン', 'バイオリン' , 'ヴァイオリン'], # 点訳のてびき第3版 第2章 その1 2 1 No.4\r
144         ['ヴィタミン', 'ビタミン', 'ヴィタミン'], # 点訳のてびき第3版 第2章 その1 2 1 No.6\r
145         ['ラヂオ', 'ラジオ'], # 点訳のてびき第3版 第2章 その1 2 1 No.22\r
146         ['ヂャケット', 'ジャケット'], # 点訳のてびき第3版 第2章 その1 2 1 No.23\r
147         ['ウヰスキー', 'ウイスキー'], # 点訳のてびき第3版 第2章 その1 2 1 No.25\r
148         ['スヰフト', 'スイフト'], # 点訳のてびき第3版 第2章 その1 2 1 No.26\r
149         ['ヱルテル', 'ウェルテル'], # 点訳のてびき第3版 第2章 その1 2 1 No.27\r
150         ['ヲルポール', 'ウォルポール'], # 点訳のてびき第3版 第2章 その1 2 1 No.28\r
151         ['ヘリコプタア', 'ヘリコプター'], # 点訳のてびき第3版 第2章 その1 2 1 No.29\r
152         ['ちゅうりっぷ', 'チューリップ'], # 点訳のてびき第3版 第2章 その1 2 1 No.30\r
153         ['おおきに', 'オーキニ',  'オオキニ', ], # 点訳のてびき第3版 第2章 その1 2 3 No.4\r
154         ['おみやぁさん', 'オミャアサン', ], # 点訳のてびき第3版 第2章 その1 2 3 No.6\r
155         ['先生ぇさまぁ', 'センセエサマア', ], # 点訳のてびき第3版 第2章 その1 2 3 No.7\r
156         ['おとゥ', 'オトー', ], # 点訳のてびき第3版 第2章 その1 2 4 No.1\r
157         ['おかァ', 'オカア', ], # 点訳のてびき第3版 第2章 その1 2 4 No.1\r
158         ['クヮルテット', 'クァルテット', ], # 点訳のてびき第3版 第2章 その1 2 4 No.5\r
159         ['ヂェスチャー', 'ジェスチャー', ], # 点訳のてびき第3版 第2章 その1 2 4 No.6\r
160         ['スェーター', 'スエーター', ], # 点訳のてびき第3版 第2章 その1 2 4 No.7\r
161         ['ヒァーッ', 'ヒャーッ', ], # 点訳のてびき第3版 第2章 その1 2 4 No.8\r
162         ['大阪', 'オーサカ', 'オオサカ'], # 点訳のてびき第3版 第2章 その1 2 5 No.1\r
163         ['遠野', 'トーノ', 'トオノ' ], # 点訳のてびき第3版 第2章 その1 2 5 No.2\r
164         ['東井', 'トーイ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.3\r
165         ['青梅', 'オーメ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.10\r
166         ['透', 'トール', 'トオル', ], # 点訳のてびき第3版 第2章 その1 2 5 No.11\r
167         ['みさを', 'ミサオ', 'ミサヲ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.13\r
168         ['かほる', 'カオル', 'カホル', ], # 点訳のてびき第3版 第2章 その1 2 5 No.14\r
169         ['さをり', 'サオリ', 'サヲリ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.19\r
170         ['みやこをどり', 'ミヤコオドリ', 'ミヤコ オドリ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.24\r
171         ['をりがみ', 'オリガミ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.25\r
172         ['八幡平', 'ハチマンタイ', ], # ヤワタダイラ\r
173         ['山ん中', 'ヤマンナカ', ], # 点訳のてびき第3版 第3章 その1 2 No.14\r
174         ['そういうわけ', 'ソーユウワケ', 'ソー イウ/ワケ', ], # 点訳のてびき第3版 第3章 その1 3 No.51\r
175         ['そういう', 'ソーユウ', 'ソー イウ', ], # 点訳のてびき第3版 第3章 その1 5 No.2\r
176         ['どうして', 'ドーシテ', 'ドー シテ', ], # 点訳のてびき第3版 第3章 その1 5 No.5\r
177 \r
178         ['システムキャレット', None, 'システム/キャレット'],\r
179         ['フィードバック', None, 'フィード バック'],\r
180         ['インターフェース', None, 'インター フェース'],\r
181         ['オペレーティングシステム', None, 'オペレーティング システム'],\r
182         ['トーキングインストーラー', None, 'トーキングインストーラー'],\r
183         ['アイスクリーム', None, 'アイス クリーム'],\r
184         ['日本点字図書館', None, 'ニッポン テンジ トショカン'],\r
185 \r
186         ['通り', None, 'トオリ'],\r
187         ['狼', None, 'オオカミ'],\r
188         ['通る', None, 'トオル'],\r
189         ['多い', None, 'オオイ'],\r
190         ['多く', None, 'オオク'],\r
191         ['大晦日', None, 'オオミソカ'],\r
192         ['手作り', None, 'テヅクリ'],\r
193         ['南半球', None, 'ミナミ ハンキュー'],\r
194         ['アメリカ合衆国', None, 'アメリカ ガッシューコク'],\r
195         ['第一人者', None, 'ダイ1ニンシャ'],\r
196         ['一流', None, '1リュー'],\r
197         ['一月', None, '1ガツ'],\r
198         ['二月', None, '2ガツ'],\r
199         ['四方', None, '4ホー'],\r
200         ['六法全書', None, '6ポー ゼンショ'],\r
201         ['百人一首', None, '100ニン 1シュ'],\r
202         ['ヱビスビール', None, 'エビス ビール'],\r
203         ['日本コロムビア', None, 'ニッポン コロムビア'],\r
204         ['ビタミンE', None, 'ビタミン E'],\r
205         ['劇団四季', None, 'ゲキダン 4キ'],\r
206         ['四季', None, '4キ'],\r
207         ['四半期', None, '4ハンキ'],\r
208         ['四角形', None, '4カクケイ'],\r
209         ['四条', None, '4ジョー'],\r
210         ['二男', None, '2ナン'],\r
211         ['十数', None, 'ジュー/スー'], # 十,名詞,数\r
212         ['一輪車', None, '1リンシャ'],\r
213         ['三塁打', None, '3ルイダ'],\r
214         ['一汁一菜', None, '1ジュー 1サイ'],\r
215         ['五臓六腑', None, '5ゾー 6プ'],\r
216         ['二・二六事件', None, '2⠼26 ジケン'],\r
217         ['一段', None, '1ダン'],\r
218         ['七転び八起き', None, 'ナナコロビ ヤオキ'],\r
219         ['十重二十重', None, 'トエ ハタエ'],\r
220         ['3ラン', None, '3ラン'],\r
221         ['さんりんしゃ', None, '3リンシャ'],\r
222         ['いちばん', None, '1バン'],\r
223         ['X線', None, 'Xセン'],\r
224 \r
225         #['好かんやつ', 'スカンヤツ', 'スカン ヤツ', ], #点訳のてびき第3版 第3章 その1 2 No.16\r
226         #['嘘みたいな話', 'ウソミタイナハナシ', 'ウソミタイナ ハナシ', ], # 点訳のてびき第3版 第3章 その1 2 No.17\r
227         #['行っていらっしゃい', 'イッテイラッシャイ', 'イッテ イラッシャイ', ], # 点訳のてびき第3版 第3章 その1 4 No.77\r
228         #['ごめんください', 'ゴメンクダサイ', 'ゴメン クダサイ', ], # 点訳のてびき第3版 第3章 その1 4 No.84\r
229         #['おはようございます', 'オハヨーゴザイマス', 'オハヨー ゴザイマス', ], # 点訳のてびき第3版 第3章 その1 4 No.86\r
230 \r
231         # 点字表記辞典「あ」(1)\r
232         ['相対する', 'アイタイスル'],\r
233         ['相対的', 'ソータイテキ'], # regression test\r
234         ['相たずさえて', 'アイタズサエテ'],\r
235         ['相整う', 'アイトトノウ'],\r
236         ['同病相憐れむ', 'ドービョーアイアワレム', 'ドービョー/アイアワレム'],\r
237         ['木立の間から見える', 'コダチノアイダカラミエル'],\r
238         ['開いた口がふさがらぬ', 'アイタクチガフサガラヌ'],\r
239         ['相無く涙ぐみ足り', 'アイナクナミダグミタリ'],\r
240         ['お生憎様', 'オアイニクサマ'],\r
241         ['開かずの間', 'アカズノマ'],\r
242         ['不開の間', 'アカズノマ'],\r
243         ['山田県主', 'ヤマダノアガタヌシ'],\r
244         ['暁闇', 'アカツキヤミ'],\r
245         ['上がり降り', 'アガリオリ'],\r
246         ['河原町四条上ル', 'カワラマチシジョーアガル'],\r
247         ['秋津国', 'アキツクニ'],\r
248         ['現つ神', 'アキツカミ'],\r
249         ['阿Q正伝', 'アキューセイデン'],\r
250         ['悪源太', 'アクゲンタ'],\r
251         ['明くる朝', 'アクルアサ', 'アクル アサ'],\r
252         ['明くる年', 'アクルトシ', 'アクル トシ'],\r
253         ['明の星', 'アケノホシ', 'アケノ ホシ'],\r
254         ['麻布十番', 'アザブジューバン', 'アザブ ジューバン'],\r
255         ['男漁り', 'オトコアサリ', 'オトコ アサリ'],\r
256         ['古本漁り', 'フルホンアサリ', 'フルホン アサリ'],\r
257         ['足の甲', 'アシノコー', 'アシノ コー'],\r
258         ['日の足が伸びる', 'ヒノアシガノビル', 'ヒノアシ/ガ/ノビル'],\r
259         {'text':'醤油味', 'braille':'ショーユ アジ'},\r
260         {'text':'砂糖醤油', 'speech':'サトージョウユ'}, # regression test\r
261 \r
262         # 点字表記辞典「あ」(2)\r
263         #{'text':'足手纏い', 'braille':'アシデ マトイ'},\r
264         #{'text':'手荷物預かり所', 'braille':'テニモツ アズカリジョ'},\r
265         #{'text':'額に汗して', 'braille':'ヒタイニ アセ シテ'},\r
266         #{'text':'認め遊ばす', 'braille':'シタタメアソバス'},\r
267         {'text':'源朝臣頼政', 'braille':'ミナモトノ アソン ヨリマサ'},\r
268         {'text':'東漢直駒', 'braille':'ヤマトノ アヤノ アタイノ コマ'},\r
269         #{'text':'徒し男', 'braille':'アダシ オトコ'},\r
270         #{'text':'徒し世', 'braille':'アダシヨ'},\r
271         #{'text':'新し物好き', 'braille':'アタラシモノズキ'},\r
272         #{'text':'暖かご飯', 'braille':'アッタカ ゴハン'},\r
273         #{'text':'城跡', 'braille':'シロアト'},\r
274         #{'text':'兄妹', 'braille':'アニ イモート'},\r
275         {'text':'兄貴風を吹かす', 'input':'アニキカゼヲ フカス', 'braille':'アニキカゼ/ヲ/フカス'},\r
276         #{'text':'秀兄イ', 'braille':'ヒデ アニイ'},\r
277 ]\r
278 \r
279 if __name__ == '__main__':\r
280         JT_DIR = os.path.normpath(os.path.join(os.getcwdu(), '..', '..', 'source', 'synthDrivers', 'jtalk'))\r
281         print JT_DIR\r
282         Mecab_initialize(__print, JT_DIR)\r
283         for i in tasks:\r
284                 if isinstance(i, dict):\r
285                         if 'braille' in i:\r
286                                 if 'speech' in i:\r
287                                         item = [ i['text'], i['speech'], i['braille'] ]\r
288                                 else:\r
289                                         s = i['braille'].replace(' ', '').replace('/', '')\r
290                                         item = [ i['text'], s, i['braille'] ]\r
291                         elif 'input' in i:\r
292                                 if 'speech' in i:\r
293                                         item = [ i['text'], i['speech'], i['input'] ]\r
294                                 else:\r
295                                         s = i['input'].replace(' ', '').replace('/', '')\r
296                                         item = [ i['text'], s, i['input'] ]\r
297                         else:\r
298                                 item = [ i['text'], i['speech'] ]\r
299                 else:\r
300                         item = i\r
301                 buffer = ''\r
302                 result = get_reading(item[0])\r
303                 if item[1] is not None and result[0] != item[1]:\r
304                         __print('')\r
305                         __print('')\r
306                         __print(buffer)\r
307                         __print('input:    ' + item[0])\r
308                         __print('reading expected: ' + item[1])\r
309                         __print('reading result:   ' + result[0])\r
310                 if len(item) > 2 and result[1] != item[2]:\r
311                         __print('')\r
312                         __print('')\r
313                         __print(buffer)\r
314                         __print('input:            ' + item[0])\r
315                         __print('braille expected: ' + item[2])\r
316                         __print('braille result:   ' + result[1])\r
317 \r
318         \r