完全な UCA ソリューション
これを行うための最も簡単で、簡単で、最も直接的な方法は、標準のUnicode::CollateモジュールのサブクラスであるPerl ライブラリ モジュールUnicode::Collate::Localeへのコールアウトを作成することです。必要なことは、コンストラクターにスウェーデンのロケール値を渡すことだけです。 "xv"
(スウェーデン語のテキストでは必ずしもこれを理解できないかもしれませんが、Perl は抽象文字を使用するため、任意の Unicode コード ポイントを使用できます — プラットフォームやビルドに関係なく! これほど便利な言語はほとんどありません。最近、この厄介な問題をめぐって Java との戦いに敗れています。)
問題は、Python から Perl モジュールにアクセスする方法がわからないことです。つまり、シェル コールアウトまたは両側パイプを使用する方法は別として。そのために、私はucsortと呼ばれる完全に機能するスクリプトを提供しました。これを呼び出すと、要求したことを完全に簡単に行うことができます。
このスクリプトは、完全なUnicode 照合アルゴリズムに100% 準拠しており、すべての調整オプションがサポートされています!! また、オプションのモジュールがインストールされているか、Perl 5.13 以降を実行している場合は、使いやすい CLDR ロケールに完全にアクセスできます。下記参照。
デモンストレーション
次のように並べられた入力セットを想像してください。
b o i j n l m å y e v s k h d f g t ö r x p z a ä c u q
コード ポイントによるデフォルトの並べ替えでは、次の結果が得られます。
a b c d e f g h i j k l m n o p q r s t u v x y z ä å ö
これは誰の本でも間違っています。Unicode 照合アルゴリズムを使用するスクリプトを使用すると、次の順序になります。
% perl ucsort /tmp/swedish_alphabet | fmt
a å ä b c d e f g h i j k l m n o ö p q r s t u v x y z
これがデフォルトの UCA ソートです。スウェーデン語のロケールを取得するには、次のようにucsortを呼び出します。
% perl ucsort --locale=sv /tmp/swedish_alphabet | fmt
a b c d e f g h i j k l m n o p q r s t u v x y z å ä ö
これはより良い入力デモです。まず、入力セット:
% fmt /tmp/swedish_set
cTD cDD Cöd Cbd cAD cCD cYD Cud cZD Cod cBD Cnd cQD cFD Ced Cfd cOD
cLD cXD Cid Cpd cID Cgd cVD cMD cÅD cGD Cqd Cäd cJD Cdd Ckd cÖD cÄD
Ctd Czd Cxd cHD cND cKD Cvd Chd Cyd cUD Cld Cmd cED Crd Cad Cåd Ccd
cRD cSD Csd Cjd cPD
コード ポイントで並べ替えると、次のようになります。
Cad Cbd Ccd Cdd Ced Cfd Cgd Chd Cid Cjd Ckd Cld Cmd Cnd Cod Cpd Cqd
Crd Csd Ctd Cud Cvd Cxd Cyd Czd Cäd Cåd Cöd cAD cBD cCD cDD cED cFD
cGD cHD cID cJD cKD cLD cMD cND cOD cPD cQD cRD cSD cTD cUD cVD cXD
cYD cZD cÄD cÅD cÖD
ただし、デフォルトの UCA を使用すると、次のように並べ替えられます。
% ucsort /tmp/swedish_set | fmt
cAD Cad cÅD Cåd cÄD Cäd cBD Cbd cCD Ccd cDD Cdd cED Ced cFD Cfd cGD
Cgd cHD Chd cID Cid cJD Cjd cKD Ckd cLD Cld cMD Cmd cND Cnd cOD Cod
cÖD Cöd cPD Cpd cQD Cqd cRD Crd cSD Csd cTD Ctd cUD Cud cVD Cvd cXD
Cxd cYD Cyd cZD Czd
ただし、スウェーデンのロケールでは、次のようになります。
% ucsort --locale=sv /tmp/swedish_set | fmt
cAD Cad cBD Cbd cCD Ccd cDD Cdd cED Ced cFD Cfd cGD Cgd cHD Chd cID
Cid cJD Cjd cKD Ckd cLD Cld cMD Cmd cND Cnd cOD Cod cPD Cpd cQD Cqd
cRD Crd cSD Csd cTD Ctd cUD Cud cVD Cvd cXD Cxd cYD Cyd cZD Czd cÅD
Cåd cÄD Cäd cÖD Cöd
小文字よりも大文字を優先する場合は、次のようにします。
% ucsort --upper-before-lower --locale=sv /tmp/swedish_set | fmt
Cad cAD Cbd cBD Ccd cCD Cdd cDD Ced cED Cfd cFD Cgd cGD Chd cHD Cid
cID Cjd cJD Ckd cKD Cld cLD Cmd cMD Cnd cND Cod cOD Cpd cPD Cqd cQD
Crd cRD Csd cSD Ctd cTD Cud cUD Cvd cVD Cxd cXD Cyd cYD Czd cZD Cåd
cÅD Cäd cÄD Cöd cÖD
カスタマイズされた並べ替え
ucsortを使用すると、他にも多くのことができます。たとえば、英語のタイトルを並べ替える方法は次のとおりです。
% ucsort --preprocess='s/^(an?|the)\s+//i' /tmp/titles
Anathem
The Book of Skulls
A Civil Campaign
The Claw of the Conciliator
The Demolished Man
Dune
An Early Dawn
The Faded Sun: Kesrith
The Fall of Hyperion
A Feast for Crows
Flowers for Algernon
The Forbidden Tower
Foundation and Empire
Foundation’s Edge
The Goblin Reservation
The High Crusade
Jack of Shadows
The Man in the High Castle
The Ringworld Engineers
The Robots of Dawn
A Storm of Swords
Stranger in a Strange Land
There Will Be Time
The White Dragon
通常、スクリプトを実行するには、Perl 5.10.1 以降が必要です。ロケールをサポートするには、オプションの CPAN モジュールをインストールする必要がありますUnicode::Collate::Locale
。または、そのモジュールを標準で含む Perl の開発バージョン 5.13+ をインストールすることもできます。
呼び出し規約
これは迅速なプロトタイプであるため、ucsortはほとんど文書化されていません。ただし、これはコマンドラインで受け入れるスイッチ/オプションの概要です。
# standard options
--help|?
--man|m
--debug|d
# collator constructor options
--backwards-levels=i
--collation-level|level|l=i
--katakana-before-hiragana
--normalization|n=s
--override-CJK=s
--override-Hangul=s
--preprocess|P=s
--upper-before-lower|u
--variable=s
# program specific options
--case-insensitive|insensitive|i
--input-encoding|e=s
--locale|L=s
--paragraph|p
--reverse-fields|last
--reverse-output|r
--right-to-left|reverse-input
ええ、わかりました。これは実際に の呼び出しに使用する引数リストですが、おわかりいただけGetopt::Long
たでしょうか。:)
Perl スクリプトを呼び出さずに Python から直接 Perl ライブラリ モジュールを呼び出す方法を理解できる場合は、ぜひそうしてください。私は自分自身の方法を知りません。方法を学びたいです。
それまでの間、このスクリプトは、特定のすべての作業で必要なことを実行できると信じています。 私は今、これをすべてのテキストソートに使用しています。それはついに私が長い間必要としていたことをします。
唯一の欠点は、通常の非ロケールでありながら 100% UCA 準拠--locale
の並べ替えには十分な速度ですが、引数によってパフォーマンスが大幅に低下することです。すべてをメモリにロードするため、ギガバイトのドキュメントではおそらくこれを使用したくないでしょう。私はこれを 1 日に何度も使用しています。