LoginSignup
3
1

More than 5 years have passed since last update.

京都大学テキストコーパスがmacOSXで変換できない。

Posted at

はじめに

今までプログラムなんて触ったことがなかった人間が、研究で自然言語処理をやることになった。
JUMAN++を使って色々やるにあたって、京大のコーパスを使おうと毎日新聞のデータを用意したが、肝心の変換用perlスクリプトが動かない。
web上に情報が少なかったため、頑張った情報をまとめてみた。

前提とか環境とか

どんな状況になったか。

以下のサイトを参考にしたが、エンコード関係のエラーが改善されない。
satomacoto: Macで京都大学テキストコーパスの変換
ここでは、format.plとnum2KNP.plを書き換えればいいよ、と紹介されていた。
しかし、この通りスクリプトを書き換えてもエラーが出て先に進まない・・・。
最近Pythonを始めたばかりで、perlの事なんてなお解らない。

次の一手

解らないなりに色々と試行錯誤してみた結果、参考になりそうなサイトもいくつか発見した。

PerlでUTF-8の文字コードを扱う

とにかく、全てのファイルをUTF-8で扱うのが間違いない、気がする。
nkfを使って、スクリプトが入っている/scr以下を全て雑に書き換えてやった。
nkf -wd *
そもそも、初心者過ぎてnkfが解らなくてこれも苦労した

スクリプトを書き換えると・・・

次に、format.plを下の様に書き換えた。元の文はコメントアウトしてある部分。

format.pl(old)
#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を以下の様に書き換える。

trans.pl
# use encoding 'euc-jp', STDIN => 'shift_jis';
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";

mainichi.plも同じように

mainichi.pl
# use encoding 'euc-jp';
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";

こちらは、下の方にある出力も書き変えてみた。

mainichi.pl
# open(OUT, '> :encoding(euc-jp)', "$base_dir/$current_month.all");
open(OUT, '> :utf8', "$base_dir/$current_month.all");

もうこの辺からやけくそ。とりあえず数打ちゃ当たる戦法をとる。

grepKNP.pl
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でちょっと離れたところのコードを書くときはどうすればいいんだろう。

dupli.pl
# use encoding 'euc-jp';
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";
tree.pl
use Encode qw(encode);
# use encoding 'euc-jp';
use utf8;

動いた!!

これでなんとか動き出して、エラー無しで最後まで変換できたっぽい!
しかし、生成されたKNPファイルが正しく変換できたものなのか、それはまだ解らない・・・。

プログラマー初心者だけど、Qiitaのコミュニティには可能性を感じたので共有してみました。
色々と間違っている事もあるかと思いますので、是非ご指導いただけましたら幸いです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1