OSDN Git Service

コメント内のカギ括弧の間違いを修正した。s/]/」/
[o-dic/o-dic.git] / script / oki2atk.pl
1 #!/usr/bin/perl
2 #
3 # oki2atk.pl - 沖縄辞書のファイルをATOK13形式に変換する。
4 #
5 #                                                         yonesu@syon.co.jp
6 #
7 # このスクリプトを使って、以下のように「okinawa.txt」を生成しておいて、
8 #     $ cat ../*.dic | ./oki2atk.pl -g | sort -u > okinawa.txt
9 #  ATOK13の辞書ユーティリティを起動し、
10 # 「一括処理」-「単語一括処理」の「単語ファイル(T)」に
11 #  okinawa.txtを指定し、「登録」を押下してください。
12 #
13 #  「尚灝王」(しょうこうおう)など、JIS X 0208の範囲外の文字が含まれる単語を
14 #  辞書にインポートする場合には、UTF-8 で出力してから、Notepad.exeなどで
15 #  「Unicode」(UTF-16LE BOM付き)に変換してください。
16 #
17 #############################################################################
18 #                          ATOK13での品詞体系                               #
19 #1  名詞      2  固有人姓 3  固有人名 4  固有人他 5  固有地名 #
20 #6  固有組織        7  固有商品 8  固有一般 9  名詞サ変 10 名詞ザ変 #
21 #11 名詞形動        12 名サ形動 13 数詞               14 副詞               15 連体詞   #
22 #16 接続詞   17 感動詞    18 独立語    19 接頭語    20 冠数詞   #
23 #21 接尾語   22 助数詞    23 カ行五段 24 ガ行五段 25 サ行五段 #
24 #26 タ行五段        27 ナ行五段 28 バ行五段 29 マ行五段 30 ラ行五段 #
25 #31 ワ行五段        32 ハ行四段 33 一段動詞 34 カ変動詞 35 サ変動詞 #
26 #36 ザ変動詞        37 形容詞    38 形容詞ウ 39 形容動詞 40 形動タリ #
27 #41 単漢字                                                                  #
28 #############################################################################
29 #
30 require 5.6.0;
31 require 'ODIC.pm';
32 use strict;
33 use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
34
35 our $phonate;
36 our $word;
37 our $class;
38
39 my $help_only;
40 my $skip_geta;
41 my $utf8_output;
42
43 GetOptions(
44     'help|h'      => \$help_only,
45     'skip-geta|g' => \$skip_geta,
46     'utf8|u'      => \$utf8_output
47 );
48 if (defined($help_only)) {
49     print STDERR "usage: $0 [--help|-h] [--skip-geta|-g] [--utf8-output|-u]\n";
50     exit 1;
51 }
52
53 &header;
54
55 while (<>) {
56         # JIS X 0208 に含まれていない文字を含む行を読み飛ばす
57         # 読み飛ばしにはコメントに「〓あり」マーカーが必要
58         next if (defined($skip_geta) && /〓あり/);
59
60         s/#.*$//;               # `#'以降を取り去る
61         next if (/^\s*$/);      # その結果空行になった行は読み飛ばす。
62
63         if (/(\S+)\s+(\S+)\s+(\S+)/) {
64                 $phonate = $1;  # 読み
65                 $word    = $2;  # 単語
66                 $class   = $3;  # 品詞
67                 ODIC::check_phonate($phonate);
68                 ODIC::check_word($word);
69                 &convert_class;
70         }
71         else {
72                 print STDERR "Error: $.: too few field number `$_'\n";
73                 print  "$_";
74         }
75 }
76 &version;
77 exit 0;
78
79
80 sub convert_class {
81         if ($class eq "普通名詞") {
82                 $class = 1;
83         }
84         elsif ($class eq "サ変名詞") {
85                 $class = 9;
86         }
87         elsif ($class eq "形動名詞") {
88                 $class = 11;
89         }
90         elsif ($class eq "姓") {
91                 $class = 2;
92         }
93         elsif ($class eq "名") {
94                 $class = 3;
95         }
96         elsif ($class eq "その他の人名") {
97                 $class = 4;
98         }
99         elsif ($class eq "単純地名") {
100                 $class = 5;
101         }
102         elsif ($class eq "接尾語付き地名") {
103                 $class = 5;
104         }
105         elsif ($class eq "組織名") {
106                 $class = 6;
107         }
108         elsif ($class eq "その他固有名詞") {
109                 $class = 7;
110         }
111         elsif ($class eq "副詞") {
112                 $class = 14;
113         }
114         elsif ($class eq "接続詞") {
115                 $class = 16;
116         }
117         elsif ($class eq "感動詞") {
118                 $class = 17;
119         }
120         elsif ($class eq "形容詞") {
121                 $class = 37;
122         }
123         elsif ($class eq "形容動詞") {
124                 $class = 39;
125         }
126         elsif ($class eq "接頭語") {
127                 $class = 19;
128         }
129         elsif ($class eq "数字列接頭語") {
130                 $class = 20;
131         }
132         elsif ($class eq "接尾語") {
133                 $class = 21;
134         }
135         elsif ($class eq "人名接尾語") {
136                 $class = 21;
137         }
138         elsif ($class eq "地名接尾語") {
139                 $class = 21;
140         }
141         elsif ($class eq "組織名接尾語") {
142                 $class = 21;
143         }
144         elsif ($class eq "数字列接尾語") {
145                 $class = 13;
146         }
147         elsif ($class eq "成句") {
148                 $class = 1;
149         }
150         elsif ($class eq "無品詞") {
151                 $class = 41;
152         }
153         else {
154                 print STDERR "Error: $.: unknown class `$class': $phonate\t$word\n";
155                 if (defined($utf8_output)) {
156                         print "$phonate\t$word\t[〓]\r\n";
157                 } else {
158                         print ODIC::to_shiftjis("$phonate\t$word\t[〓]\r\n");
159                 }
160                 return;
161         }
162         if (defined($utf8_output)) {
163                 print "$phonate\t$word\t $class \r\n";
164         } else {
165                 print ODIC::to_shiftjis("$phonate\t$word\t $class \r\n");
166         }
167 }
168
169 sub version {
170         my $sec;
171         my $min;
172         my $hour;
173         my $mday;
174         my $mon;
175         my $year;
176
177         ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
178         $year += 1900;
179         $mon++;
180         if (defined($utf8_output)) {
181                 print "おきなわじしょのひづけ\t$year/$mon/$mday(沖縄辞書の日付け)\t 1 \r\n";
182         } else {
183                 print ODIC::to_shiftjis("おきなわじしょのひづけ\t$year/$mon/$mday(沖縄辞書の日付け)\t 1 \r\n");
184         }
185 }
186
187 sub header {
188         print "!!DICUT16\r\n";
189 }
190