OSDN Git Service

2e0e36f98c85c668ae0d857962cefa4e077bf016
[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('utf-8', '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         ['1行上', 'イチギョーウエ'],\r
91         ['2行', 'ニギョー'],\r
92         ['3行', 'サンギョー'],\r
93         ['現在行', 'ゲンザイギョー'],\r
94         ['最上行', 'サイジョーギョー'],\r
95         ['1行下',  'イチギョーシタ'],\r
96         ['1行上',  'イチギョーウエ'],\r
97         ['誤判定', 'ゴハンテイ'],\r
98         ['50音順', 'ゴジューオンジュン'],\r
99         ['税', 'ゼイ'],\r
100         ['三毛猫', 'ミケネコ'],\r
101         ['表計算', 'ヒョーケイサン'],\r
102         ['小文字', 'コモジ'],\r
103         ['大文字', 'オーモジ'],\r
104         ['拡張子', 'カクチョーシ'],\r
105         ['世界中', 'セカイジュー'],\r
106         ['孫正義', 'ソンマサヨシ'],\r
107         ['2分前', 'ニフンマエ'],\r
108         ['2分前', 'ニフンマエ'],\r
109         ['障がい', 'ショーガイ'],\r
110         ['親オブジェクト', 'オヤオブジェクト'],\r
111         ['z', 'ゼット'],\r
112         ['規', 'タダシ'],\r
113         ['全', 'ゼン'],\r
114         ['007', 'ゼロゼロナナ'],\r
115         ['上矢印', 'ウエヤジルシ'],\r
116         ['下矢印', 'シタヤジルシ'],\r
117         ['大見出し', 'オオミダシ'],\r
118         ['前景色', 'ゼンケイショク'],\r
119         ['梅雨前線', 'バイウゼンセン', 'バイウ ゼンセン'], \r
120         ['八ッ場ダム', 'ヤンバダム'],\r
121         ['1都5県', 'イットゴケン'],\r
122         ['1都5県', 'イットゴケン'],\r
123         ['1都6県', 'イットロッケン'],\r
124         ['1都6県', 'イットロッケン'],\r
125         ['孫正義', 'ソンマサヨシ', 'ソン マサヨシ'], \r
126         ['きゃりーぱみゅぱみゅ', 'キャリーパミュパミュ'],\r
127         ['いひ', 'イヒ'], # http://sourceforge.jp/ticket/browse.php?group_id=4221&tid=30919\r
128         ['金', 'キン' ],\r
129         ['1月', 'イチガツ', '1ガツ'], # NVDA点字表示の誤り No.18\r
130         ['為おおせる', 'シオオセル'], # 点訳のてびき第3版 第2章 その1 1 5 No.63\r
131         ['凡そ', 'オオヨソ'], # 点訳のてびき第3版 第2章 その1 1 5 No.67\r
132         ['無花果', 'イチジク'], # 点訳のてびき第3版 第2章 その1 1 6 No.3\r
133         ['砂利道', 'ジャリミチ'], # 点訳のてびき第3版 第2章 その1 1 6 No.10\r
134         ['少しずつ', 'スコシズツ'], # 点訳のてびき第3版 第2章 その1 1 6 No.20\r
135         ['鼓', 'ツヅミ'], # 点訳のてびき第3版 第2章 その1 1 6 No.32\r
136         ['葛籠', 'ツヅラ'], # 地名? 点訳のてびき第3版 第2章 その1 1 6 No.33\r
137         ['紅提灯', 'ベニヂョーチン'], # 点訳のてびき第3版 第2章 その1 1 6 No.39\r
138         ['まづ', 'マズ'], # 点訳のてびき第3版 第2章 その1 1 7 No.1\r
139         ['一つづつ', 'ヒトツズツ'], # 点訳のてびき第3版 第2章 その1 1 7 No.2\r
140         ['大きう', 'オオキュー'], # 点訳のてびき第3版 第2章 その1 1 7 No.5\r
141         ['うれしう', 'ウレシュー'], # 点訳のてびき第3版 第2章 その1 1 7 No.6\r
142         ['もみぢ', 'モミジ'], # 点訳のてびき第3版 第2章 その1 1 7 No.7\r
143         ['みづうみ', 'ミズウミ'], # 点訳のてびき第3版 第2章 その1 1 7 No.8\r
144         ['ヴァイオリン', 'バイオリン' , 'ヴァイオリン'], # 点訳のてびき第3版 第2章 その1 2 1 No.4\r
145         ['ヴィタミン', 'ビタミン', 'ヴィタミン'], # 点訳のてびき第3版 第2章 その1 2 1 No.6\r
146         ['ラヂオ', 'ラジオ'], # 点訳のてびき第3版 第2章 その1 2 1 No.22\r
147         ['ヂャケット', 'ジャケット'], # 点訳のてびき第3版 第2章 その1 2 1 No.23\r
148         ['ウヰスキー', 'ウイスキー'], # 点訳のてびき第3版 第2章 その1 2 1 No.25\r
149         ['スヰフト', 'スイフト'], # 点訳のてびき第3版 第2章 その1 2 1 No.26\r
150         ['ヱルテル', 'ウェルテル'], # 点訳のてびき第3版 第2章 その1 2 1 No.27\r
151         ['ヲルポール', 'ウォルポール'], # 点訳のてびき第3版 第2章 その1 2 1 No.28\r
152         ['ヘリコプタア', 'ヘリコプター'], # 点訳のてびき第3版 第2章 その1 2 1 No.29\r
153         ['ちゅうりっぷ', 'チューリップ'], # 点訳のてびき第3版 第2章 その1 2 1 No.30\r
154         ['おおきに', 'オーキニ',  'オオキニ', ], # 点訳のてびき第3版 第2章 その1 2 3 No.4\r
155         ['おみやぁさん', 'オミャアサン', ], # 点訳のてびき第3版 第2章 その1 2 3 No.6\r
156         ['先生ぇさまぁ', 'センセエサマア', ], # 点訳のてびき第3版 第2章 その1 2 3 No.7\r
157         ['おとゥ', 'オトー', ], # 点訳のてびき第3版 第2章 その1 2 4 No.1\r
158         ['おかァ', 'オカア', ], # 点訳のてびき第3版 第2章 その1 2 4 No.1\r
159         ['クヮルテット', 'クァルテット', ], # 点訳のてびき第3版 第2章 その1 2 4 No.5\r
160         ['ヂェスチャー', 'ジェスチャー', ], # 点訳のてびき第3版 第2章 その1 2 4 No.6\r
161         ['スェーター', 'スエーター', ], # 点訳のてびき第3版 第2章 その1 2 4 No.7\r
162         ['ヒァーッ', 'ヒャーッ', ], # 点訳のてびき第3版 第2章 その1 2 4 No.8\r
163         ['大阪', 'オーサカ', 'オオサカ'], # 点訳のてびき第3版 第2章 その1 2 5 No.1\r
164         ['遠野', 'トーノ', 'トオノ' ], # 点訳のてびき第3版 第2章 その1 2 5 No.2\r
165         ['東井', 'トーイ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.3\r
166         ['青梅', 'オーメ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.10\r
167         ['透', 'トール', 'トオル', ], # 点訳のてびき第3版 第2章 その1 2 5 No.11\r
168         ['みさを', 'ミサオ', 'ミサヲ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.13\r
169         ['かほる', 'カオル', 'カホル', ], # 点訳のてびき第3版 第2章 その1 2 5 No.14\r
170         ['さをり', 'サオリ', 'サヲリ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.19\r
171         ['みやこをどり', 'ミヤコオドリ', 'ミヤコ オドリ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.24\r
172         ['をりがみ', 'オリガミ', ], # 点訳のてびき第3版 第2章 その1 2 5 No.25\r
173         ['八幡平', 'ハチマンタイ', ], # ヤワタダイラ\r
174         ['山ん中', 'ヤマンナカ', ], # 点訳のてびき第3版 第3章 その1 2 No.14\r
175         ['そういうわけ', 'ソーユウワケ', 'ソー イウ/ワケ', ], # 点訳のてびき第3版 第3章 その1 3 No.51\r
176         ['そういう', 'ソーユウ', 'ソー イウ', ], # 点訳のてびき第3版 第3章 その1 5 No.2\r
177         ['どうして', 'ドーシテ', 'ドー シテ', ], # 点訳のてびき第3版 第3章 その1 5 No.5\r
178 \r
179         ['システムキャレット', None, 'システム/キャレット'],\r
180         ['フィードバック', None, 'フィード バック'],\r
181         ['インターフェース', None, 'インター フェース'],\r
182         ['オペレーティングシステム', None, 'オペレーティング システム'],\r
183         ['トーキングインストーラー', None, 'トーキングインストーラー'],\r
184         ['アイスクリーム', None, 'アイス クリーム'],\r
185         ['日本点字図書館', None, 'ニッポン テンジ トショカン'],\r
186 \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, 'アメリカ ガッシューコク'],\r
196         ['第一人者', None, 'ダイ1ニンシャ'],\r
197         ['一流', None, '1リュー'],\r
198         ['一月', None, '1ガツ'],\r
199         ['二月', None, '2ガツ'],\r
200         ['四方', None, '4ホー'],\r
201         ['六法全書', None, '6ポー ゼンショ'],\r
202         ['百人一首', None, '100ニン 1シュ'],\r
203         ['ヱビスビール', None, 'エビス ビール'],\r
204         ['日本コロムビア', None, 'ニッポン コロムビア'],\r
205         ['ビタミンE', None, 'ビタミン E'],\r
206         ['劇団四季', None, 'ゲキダン 4キ'],\r
207         ['四季', None, '4キ'],\r
208         ['四半期', None, '4ハンキ'],\r
209         ['四角形', None, '4カクケイ'],\r
210         ['四条', None, '4ジョー'],\r
211         ['二男', None, '2ナン'],\r
212         ['十数', None, 'ジュー/スー'], # 十,名詞,数\r
213         ['一輪車', None, '1リンシャ'],\r
214         ['三塁打', None, '3ルイダ'],\r
215         ['一汁一菜', None, '1ジュー 1サイ'],\r
216         ['五臓六腑', None, '5ゾー 6プ'],\r
217         ['二・二六事件', None, '2⠼26 ジケン'],\r
218         ['一段', None, '1ダン'],\r
219         ['七転び八起き', None, 'ナナコロビ ヤオキ'],\r
220         ['十重二十重', None, 'トエ ハタエ'],\r
221         ['3ラン', None, '3ラン'],\r
222         ['さんりんしゃ', None, '3リンシャ'],\r
223         ['いちばん', None, '1バン'],\r
224         ['X線', None, 'Xセン'],\r
225 \r
226         {'text':'カムイト゚ラノ', 'speech':'カムイトラノ'}, # U+ff9f\r
227         {'text':'カムイト゚ラノ', 'speech':'カムイトラノ'}, # U+309a\r
228         {'text':'カムイト゜ラノ', 'speech':'カムイトラノ'}, # U+309c\r
229 \r
230         {'text':'触読', 'braille':'ショクドク'},\r
231         {'text':'触読式時計', 'braille':'ショクドクシキ トケイ'},\r
232         {'text':'触手話', 'braille':'ショクシュワ'},\r
233         {'text':'触読手話', 'braille':'ショクドク/シュワ'},\r
234         {'text':'盲ろう', 'braille':'モーロー'},\r
235 \r
236         {'text':'泉質', 'braille':'センシツ'},\r
237         {'text':'硫酸塩', 'braille':'リューサンエン'},\r
238         {'text':'硫酸塩泉', 'braille':'リューサンエンセン'},\r
239         {'text':'塩化物泉', 'braille':'エンカブッセン'},\r
240         {'text':'泉温', 'braille':'センオン'},\r
241         {'text':'冷鉱泉', 'braille':'レイコーセン'},\r
242         {'text':'微温泉', 'braille':'ビオンセン'},\r
243         {'text':'療養泉', 'braille':'リョーヨーセン'},\r
244         {'text':'低張性', 'braille':'テイチョーセイ'},\r
245         {'text':'等張性', 'braille':'トーチョーセイ'},\r
246         {'text':'高張性', 'braille':'コーチョーセイ'},\r
247         {'text':'酸性泉', 'braille':'サンセイセン'},\r
248         {'text':'放射能泉', 'braille':'ホーシャノーセン'},\r
249 \r
250         #['好かんやつ', 'スカンヤツ', 'スカン ヤツ', ], #点訳のてびき第3版 第3章 その1 2 No.16\r
251         #['嘘みたいな話', 'ウソミタイナハナシ', 'ウソミタイナ ハナシ', ], # 点訳のてびき第3版 第3章 その1 2 No.17\r
252         #['行っていらっしゃい', 'イッテイラッシャイ', 'イッテ イラッシャイ', ], # 点訳のてびき第3版 第3章 その1 4 No.77\r
253         #['ごめんください', 'ゴメンクダサイ', 'ゴメン クダサイ', ], # 点訳のてびき第3版 第3章 その1 4 No.84\r
254         #['おはようございます', 'オハヨーゴザイマス', 'オハヨー ゴザイマス', ], # 点訳のてびき第3版 第3章 その1 4 No.86\r
255 \r
256         # 点字表記辞典「あ」(1)\r
257         ['相対する', 'アイタイスル'],\r
258         ['相対的', 'ソータイテキ'], # regression test\r
259         ['相たずさえて', 'アイタズサエテ'],\r
260         ['相整う', 'アイトトノウ'],\r
261         ['同病相憐れむ', 'ドービョーアイアワレム', 'ドービョー/アイアワレム'],\r
262         ['木立の間から見える', 'コダチノアイダカラミエル'],\r
263         ['開いた口がふさがらぬ', 'アイタクチガフサガラヌ'],\r
264         ['相無く涙ぐみ足り', 'アイナクナミダグミタリ'],\r
265         ['お生憎様', 'オアイニクサマ'],\r
266         ['開かずの間', 'アカズノマ'],\r
267         ['不開の間', 'アカズノマ'],\r
268         ['山田県主', 'ヤマダノアガタヌシ'],\r
269         ['暁闇', 'アカツキヤミ'],\r
270         ['上がり降り', 'アガリオリ'],\r
271         ['河原町四条上ル', 'カワラマチシジョーアガル'],\r
272         ['秋津国', 'アキツクニ'],\r
273         ['現つ神', 'アキツカミ'],\r
274         ['阿Q正伝', 'アキューセイデン'],\r
275         ['悪源太', 'アクゲンタ'],\r
276         ['明くる朝', 'アクルアサ', 'アクル アサ'],\r
277         ['明くる年', 'アクルトシ', 'アクル トシ'],\r
278         ['明の星', 'アケノホシ', 'アケノ ホシ'],\r
279         ['麻布十番', 'アザブジューバン', 'アザブ ジューバン'],\r
280         ['男漁り', 'オトコアサリ', 'オトコ アサリ'],\r
281         ['古本漁り', 'フルホンアサリ', 'フルホン アサリ'],\r
282         ['足の甲', 'アシノコー', 'アシノ コー'],\r
283         ['日の足が伸びる', 'ヒノアシガノビル', 'ヒノアシ/ガ/ノビル'],\r
284         {'text':'醤油味', 'braille':'ショーユ アジ'},\r
285         {'text':'砂糖醤油', 'speech':'サトージョウユ'}, # regression test\r
286 \r
287         # 点字表記辞典「あ」(2)\r
288         #{'text':'足手纏い', 'braille':'アシデ マトイ'},\r
289         #{'text':'手荷物預かり所', 'braille':'テニモツ アズカリジョ'},\r
290         #{'text':'額に汗して', 'braille':'ヒタイニ アセ シテ'},\r
291         #{'text':'認め遊ばす', 'braille':'シタタメアソバス'},\r
292         {'text':'源朝臣頼政', 'braille':'ミナモトノ アソン ヨリマサ'},\r
293         {'text':'東漢直駒', 'braille':'ヤマトノ アヤノ アタイノ コマ'},\r
294         #{'text':'徒し男', 'braille':'アダシ オトコ'},\r
295         #{'text':'徒し世', 'braille':'アダシヨ'},\r
296         #{'text':'新し物好き', 'braille':'アタラシモノズキ'},\r
297         #{'text':'暖かご飯', 'braille':'アッタカ ゴハン'},\r
298         #{'text':'城跡', 'braille':'シロアト'},\r
299         #{'text':'兄妹', 'braille':'アニ イモート'},\r
300         {'text':'兄貴風を吹かす', 'input':'アニキカゼヲ フカス', 'braille':'アニキカゼ/ヲ/フカス'},\r
301         #{'text':'秀兄イ', 'braille':'ヒデ アニイ'},\r
302 \r
303         {'text':'一日から十日', 'braille':'イチ/ニチ/カラ/ジュー/ニチ'},\r
304         {'text':'1日から10日', 'braille':'イチ/ニチ/カラ/イチ/ゼロ/ニチ'},\r
305         {'text':'一日から一〇日', 'braille':'イチ/ニチ/カラ/イチ/レイ/ニチ'},\r
306         {'text':'名speech集', 'speech':'メイスピーチシュー', 'braille':'メイspeechシュー'},\r
307         {'text':'一人当り10個ずつ', 'braille':'ヒトリアタリ/イチ/ゼロ/コ/ズツ'},\r
308         {'text':'04月', 'speech':'ゼロシガツ', 'braille':'ゼロ/4ガツ'},\r
309 ]\r
310 \r
311 if __name__ == '__main__':\r
312         JT_DIR = os.path.normpath(os.path.join(os.getcwdu(), '..', '..', 'source', 'synthDrivers', 'jtalk'))\r
313         print JT_DIR\r
314         Mecab_initialize(__print, JT_DIR)\r
315         for i in tasks:\r
316                 if isinstance(i, dict):\r
317                         if 'braille' in i:\r
318                                 if 'speech' in i:\r
319                                         item = [ i['text'], i['speech'], i['braille'] ]\r
320                                 else:\r
321                                         s = i['braille'].replace(' ', '').replace('/', '')\r
322                                         item = [ i['text'], s, i['braille'] ]\r
323                         elif 'input' in i:\r
324                                 if 'speech' in i:\r
325                                         item = [ i['text'], i['speech'], i['input'] ]\r
326                                 else:\r
327                                         s = i['input'].replace(' ', '').replace('/', '')\r
328                                         item = [ i['text'], s, i['input'] ]\r
329                         else:\r
330                                 item = [ i['text'], i['speech'] ]\r
331                 else:\r
332                         item = i\r
333                 buffer = ''\r
334                 result = get_reading(item[0])\r
335                 if item[1] is not None and result[0] != item[1]:\r
336                         __print('')\r
337                         __print('')\r
338                         __print(buffer)\r
339                         __print('input:    ' + item[0])\r
340                         __print('reading expected: ' + item[1])\r
341                         __print('reading result:   ' + result[0])\r
342                 if len(item) > 2 and result[1] != item[2]:\r
343                         __print('')\r
344                         __print('')\r
345                         __print(buffer)\r
346                         __print('input:            ' + item[0])\r
347                         __print('braille expected: ' + item[2])\r
348                         __print('braille result:   ' + result[1])\r
349 \r
350         \r