完全な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ライブラリモジュールを呼び出す方法を理解できる場合は、必ずそうしてください。自分がどうなのかわからない。方法を学びたいです。
とりあえず、このスクリプトは、特に必要なことをすべて実行できると思います。 これをすべてのテキストの並べ替えに使用します。それは最終的に私は長い、長い時間のために必要だことありません。
唯一の欠点は、この--locale
引数によりパフォーマンスが低下することですが、通常のロケールではありませんが、100%UCA準拠の並べ替えには十分高速です。メモリにすべてをロードするので、ギガバイトのドキュメントでこれを使用することはおそらく望ましくありません。私は1日に何度も使用していますが、ついにテキストの並べ替えがうまくいくのは素晴らしいことです。