Полное решение УЦА
Самый простой, легкий и понятный способ сделать это - вызвать модуль библиотеки Perl, Unicode :: Collate :: Locale , который является подклассом стандартного модуля Unicode :: Collate . Все, что вам нужно сделать, это передать конструктору значение локали "xv"
для Швеции.
(Вы можете не обязательно ценить это для шведского текста, но поскольку Perl использует абстрактные символы, вы можете использовать любой код Unicode, какой захотите - независимо от платформы или сборки! Некоторые языки предлагают такое удобство. Я упоминаю об этом, потому что я борюсь с в последнее время много проигрывает битве с Java из-за этой сводящей с ума проблемы.)
Проблема в том, что я не знаю, как получить доступ к модулю Perl из Python - за исключением использования выноски оболочки или двустороннего канала. С этой целью я предоставил вам полный рабочий сценарий под названием ucsort. который вы можете вызвать, чтобы с легкостью выполнить именно то, что вы просили.
Этот скрипт на 100% совместим с полным алгоритмом сортировки Unicode , при этом поддерживаются все параметры настройки !! А если у вас установлен дополнительный модуль или вы используете 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 . Поскольку он загружает все в память, вы, вероятно, не захотите использовать его для гигабайтных документов. Я использую его много раз в день, и я уверен, что наконец-то здорово, что у меня появилась разумная сортировка текста.