綾小路龍之介の素人思考

[perl] 日本語禁則処理モジュール比較

Text::Wrap、Text::WrapI18N、Text::Format、Lingua::JA::Fold、Text::LineFoldのそれぞれについて禁則処理の確認を行ったところ、Text::LineFoldが最も良い結果を返した。

以下のようなテストスクリプトを用意する。

#!/usr/bin/perl -l
use warnings;
use strict;
use Encode;
use Text::Wrap;
use Text::WrapI18N;
use Text::Format;
use Lingua::JA::Fold;
use Text::LineFold;

my $utf8    = find_encoding('utf8');
my $columns = 72;
my $text    = <STDIN>;
$text = $utf8->decode($text);

#{
#    print $utf8->encode($text);
#}
{
    print "* Text::Wrap\n";
    $Text::Wrap::columns = $columns;
    my $folded = &Text::Wrap::wrap( '', '', $text );
    print_cols();
    print $utf8->encode($folded);
}
{
    print "* Text::Format\n";
    my $tf = Text::Format->new( { columns => $columns, firstIndent => 0 } );
    my $folded = $tf->format($text);
    print_cols();
    print $utf8->encode($folded);
}
{
    print "* Text::WrapI18N\n";
    $Text::WrapI18N::columns = $columns;
    my $folded = &Text::WrapI18N::wrap( '', '', $text );
    print_cols();
    print $utf8->encode($folded);
}
{
    print "* Lingua::JA::Fold\n";
    my $folded = &Lingua::JA::Fold::fold(
        text   => $text,
        length => int $columns / 2,
        mode   => 'full-width'
    );
    print_cols();
    print $utf8->encode($folded);
}
{
    print "* Text::LineFold\n";
    my $lf = Text::LineFold->new( ColMax => $columns );
    my $folded = $lf->fold( '', '', $text );
    print_cols();
    print $folded;
}
exit;

sub print_cols {
    print join( '', map { "$_---------" } ( 0 .. 7 ) );
    print "0123456789" x 8;
}
__END__

次のような文字列を半角74文字幅で折り返すことを考える。英字が使われておらず、半角スペースも無い文字列。

$ cat kinsoku.txt
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分は停車場のブリッジを、上って、降りて、そうしてそれが線路をまたぎ越えるために造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだとばかり思っていました。しかも、かなり永い間そう思っていたのです。ブリッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢抜(あかぬ)けのした遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思っていたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに興が覚めました。

上のスクリプトを走らせた結果が以下。Text::Wrapは半角74文字幅ではなく文字数で74文字。Text::Formatは折り返しされず。Text::WrapI18Nは折り返しの基準が良くわからない、エラーも起きている。Lingua::JA::Foldは行頭に約物である句読点が来ている。Text::LineFoldは問題なし。

$ perl kinsoku.pl < kinsoku.txt
* Text::Wrap

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分
は停車場のブリッジを、上って、降りて、そうしてそれが線路をまたぎ越えるために造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の
遊戯場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだとばかり思っていました。しかも、かなり永い間そう思っていたのです。ブ
リッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢抜(あかぬ)けのした遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだ
と思っていたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに興が覚めました。

* Text::Format

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分は停車場のブリッジを、上って、降りて、そうしてそれが線路をまたぎ越えるために造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだとばかり思っていました。しかも、かなり永い間そう思っていたのです。ブリッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢抜(あかぬ)けのした遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思っていたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに興が覚めました。

* Text::WrapI18N

substr outside of string at /usr/share/perl5/Text/WrapI18N.pm line 130, <STDIN> line 1.
Use of uninitialized value $text in length at /usr/share/perl5/Text/WrapI18N.pm line 52, <STDIN> line 1.
0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
自分には、人間の生活というものが、見当つかないのです。
自分は東北の田舎に生れましたので、汽車をはじめて
見たのは、よほど大きくなってからでした。自分は停車場のブリッジを、
上って、降りて、そうして
それが線路をまたぎ越えるために造られたものだという事には全然気づか
ず、ただそれは停車場の構内を外国の遊戯場みたいに、複雑に楽しく、ハイカラ
にするためにのみ、設備せられてあるものだとばかり思っていまし
た。しかも、かなり永い間そう思っていたのです。ブ
リッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢
抜(あかぬ)けのした遊戯で、それは鉄道のサーヴィスの中でも、
最も気のきいたサーヴィスの一つだと思っていたのですが、
のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過
ぎないのを発見して、にわかに興が覚めました。

* Lingua::JA::Fold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生
れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分は
停車場のブリッジを、上って、降りて、そうしてそれが線路をまたぎ越えるために
造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯
場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだ
とばかり思っていました。しかも、かなり永い間そう思っていたのです。ブリッジ
の上ったり降りたりは、自分にはむしろ、ずいぶん垢抜(あかぬ)けのした遊戯で
、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思って
いたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階
段に過ぎないのを発見して、にわかに興が覚めました。

* Text::LineFold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生
れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分は
停車場のブリッジを、上って、降りて、そうしてそれが線路をまたぎ越えるために
造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯
場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだ
とばかり思っていました。しかも、かなり永い間そう思っていたのです。ブリッジ
の上ったり降りたりは、自分にはむしろ、ずいぶん垢抜(あかぬ)けのした遊戯
で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思っ
ていたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な
階段に過ぎないのを発見して、にわかに興が覚めました。

また、次のような文字列を半角74文字幅で折り返すことを考える。英字と日本語の混在文。

$ cat kinsoku.txt
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、Cやsed、awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。Webアプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションはMovable TypeやSpamAssassinなど。

この場合の結果が以下。Text::Wrap、Text::Format、Text::WrapI18Nは上と同様に折り返しが期待通りではない。Lingua::JA::Foldは行末の英単語(Movable)処理に失敗。Text::LineFoldは問題なし。

$ perl kinsoku.pl < kinsoku.txt
* Text::Wrap

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、Cやsed、
awk、シェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。Webアプリケーション、システム管理、テキスト
処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションはMovable
TypeやSpamAssassinなど。

* Text::Format

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。実用性と多様性を重視しており、Cやsed、awk、シェルスクリプトなど他のプログラミ ング言語の優れた機能を取り入れている。Webアプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションはMovable
TypeやSpamAssassinなど。

* Text::WrapI18N

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl(パール)とは、ラリー・ウォールによって開
発されたプログラミング言語である。実用性と多様性を重視してお
り、Cやsed、awk、シェルスクリプトなど他のプログラミング言
語の優れた機能を取り入れている。Webアプリケーション、システ
ム管理、テキスト処理などのプログラムを書くのに広く用いられて
いる。代表的なアプリケーションはMovable TypeやSpamAssassinなど。

* Lingua::JA::Fold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミ
ング言語である。実用性と多様性を重視しており、Cやsed、awk、シェ
ルスクリプトなど他のプログラミング言語の優れた機能を取り入れてい
る。Webアプリケーション、システム管理、テキスト処理などのプログ
ラムを書くのに広く用いられている。代表的なアプリケーションはMova
ble TypeやSpamAssassinなど。

* Text::LineFold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl(パール)とは、ラリー・ウォールによって開発されたプログラミ
ング言語である。実用性と多様性を重視しており、Cやsed、awk、シェ
ルスクリプトなど他のプログラミング言語の優れた機能を取り入れてい
る。Webアプリケーション、システム管理、テキスト処理などのプログ
ラムを書くのに広く用いられている。代表的なアプリケーションは
Movable TypeやSpamAssassinなど。

最後に、次のような文字列を半角72文字幅で折り返すことを考える。英文。

$ cat kinsoku.txt
Perl is a general-purpose programming language originally developed for text manipulation and now used for a wide range of tasks including system administration, web development, network programming, GUI development, and more.

この場合の結果が以下。Text::Wrap、Text::Format、Text::WrapI18N、Text::LineFoldは期待通り。Lingua::JA::Foldは行末の英単語を分割してしまう。

$ perl kinsoku.pl < kinsoku.txt
* Text::Wrap

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including
system administration, web development, network programming, GUI
development, and more.

* Text::Format

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including
system administration, web development, network programming, GUI
development, and more.

* Text::WrapI18N

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including
system administration, web development, network programming, GUI
development, and more.

* Lingua::JA::Fold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including syste
m administration, web development, network programming, GUI development,
 and more.

* Text::LineFold

0---------1---------2---------3---------4---------5---------6---------7---------
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Perl is a general-purpose programming language originally developed for
text manipulation and now used for a wide range of tasks including
system administration, web development, network programming, GUI
development, and more.

これらのことから、Text::LineFoldは英文、邦文、日本語と英語混じり文について期待通りの結果を返すことがわかる。

リファレンス

  1. Text::Wrap - search.cpan.org
  2. Text::WrapI18N - search.cpan.org
  3. Text::Format - search.cpan.org
  4. Lingua::JA::Fold - search.cpan.org
  5. Text::LineFold - search.cpan.org
  6. 太宰治 人間失格
  7. perl - Perl 5 言語インタプリタ 【perldoc.jp】
  8. perlintro - perldoc.perl.org
  9. 約物 - Wikipedia
  10. 禁則処理 - Wikipedia

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-05-16T06:59:55+09:00
  2. Modified: 2010-05-16T06:59:55+09:00
  3. Generated: 2017-03-13T23:09:18+09:00