はじめに
今までプログラムなんて触ったことがなかった人間が、研究で自然言語処理をやることになった。
JUMAN++を使って色々やるにあたって、京大のコーパスを使おうと毎日新聞のデータを用意したが、肝心の変換用perlスクリプトが動かない。
web上に情報が少なかったため、頑張った情報をまとめてみた。
前提とか環境とか
- macOS Mojave 10.14.4
- Perl 5.18.2
-
京都大学テキストコーパス - KUROHASHI-KAWAHARA LAB
- 変換スクリプトファイル EUC-JP
- 毎日新聞データ(mai1995.txt) Shift_jis
どんな状況になったか。
以下のサイトを参考にしたが、エンコード関係のエラーが改善されない。
satomacoto: Macで京都大学テキストコーパスの変換
ここでは、format.plとnum2KNP.plを書き換えればいいよ、と紹介されていた。
しかし、この通りスクリプトを書き換えてもエラーが出て先に進まない・・・。
最近Pythonを始めたばかりで、perlの事なんてなお解らない。
次の一手
解らないなりに色々と試行錯誤してみた結果、参考になりそうなサイトもいくつか発見した。
とにかく、全てのファイルをUTF-8で扱うのが間違いない、気がする。
nkfを使って、スクリプトが入っている/scr
以下を全て雑に書き換えてやった。
nkf -wd *
そもそも、初心者過ぎてnkfが解らなくてこれも苦労した
スクリプトを書き換えると・・・
次に、format.plを下の様に書き換えた。元の文はコメントアウトしてある部分。
#use encoding 'euc-jp';
#use open IO => ':encoding(euc-jp)';
#use open ":std";
#binmode(STDERR, ':encoding(euc-jp)');
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
これでなんとか先に進めるようになったのだけど、次はmaking KyotoCorpus (syn) ...
のあとから、
converting 9512ED ...
Can't find 951201043-001 in ../dat/num/9512ED.org at ../src/num2KNP.pl line 45, <ORG> line 9043.
とエラーが出てしまう。
もうよく分からないけど、変換された生成物であろう、.orgを開いてみると、激しく文字化け・・・。
auto_convとにらめっこしてみると、
.orgファイルは.allを変換したものみたい。
そしてそもそもの*.allが文字化けしている。
やっぱ元のテキストをshift-jisのまま扱ってるのがダメなのか?
毎日新聞データをUTF-8に変換
nkfでutfに変換してみる。
nkf -wd mai1995.txt > mai95.txt
しかしこれでもダメ。
紹介されていたページでは、format.plとnum2KNP.plを書き換える、とあったけど、
やっぱり、*.allを生成しているスクリプトは別物だし、全部書き換えてやる必要があるっぽい。
やってやる。
各スクリプトの書き換え
trans.plを以下の様に書き換える。
# use encoding 'euc-jp', STDIN => 'shift_jis';
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
mainichi.plも同じように
# use encoding 'euc-jp';
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
こちらは、下の方にある出力も書き変えてみた。
# open(OUT, '> :encoding(euc-jp)', "$base_dir/$current_month.all");
open(OUT, '> :utf8', "$base_dir/$current_month.all");
もうこの辺からやけくそ。とりあえず数打ちゃ当たる戦法をとる。
use strict;
use Encode qw(decode);
# use encoding 'euc-jp';
use utf8;
---下の方もいじってみる---
# my $pattern = decode('euc-jp', $ARGV[0]);
my $pattern = decode('utf8', $ARGV[0]);
------
# open(DAT, '< :encoding(euc-jp)', $f) or die;
open(DAT, '< :encoding(utf8)', $f) or die;
基本的には同じことをしているだけ。
そもそもMarkdownでちょっと離れたところのコードを書くときはどうすればいいんだろう。
# use encoding 'euc-jp';
use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use Encode qw(encode);
# use encoding 'euc-jp';
use utf8;
動いた!!
これでなんとか動き出して、エラー無しで最後まで変換できたっぽい!
しかし、生成されたKNPファイルが正しく変換できたものなのか、それはまだ解らない・・・。
プログラマー初心者だけど、Qiitaのコミュニティには可能性を感じたので共有してみました。
色々と間違っている事もあるかと思いますので、是非ご指導いただけましたら幸いです。