FC2ブログ

本を読む

読書やコンピュータなどに関するメモ

twitter-cldr-rbの日本語文字列照合順序をsort_kana_jisx4061と比較

 拙作sort_kana_jisx4061を仲間内で紹介したところ、ICU(International Components for Unicode)をRubyで実装したtwitter-cldr-rbというのがあると教えてもらいました。

 twitter-cldr-rbはCLDR(Common Locale Data Repository)にもとづいてデータをRubyで国際化処理するもので、さまざまな機能があります。ここではsort_kana_jisx4061と同様の日本語文字列照合順序の機能を比較してみます。

twitter-cldr-rbでできること

 twitter-cldr-rbのREADME.mdを見ると、さまざまな国際化の機能があります。数字の桁区切り(カンマかピリオドかなど)、重さや長さの単位、通貨の単位、数字を言葉で書く、日時の表記、月日の表記、列挙などに対応しています。

 その1つとして、対象ロケールでの文字列照合順序が実装されています。

 照合順序のデータは、ソースの「/resources/collation/tries/」ディレクトリに、マーシャルされたバイナリデータとして用意されています。ja.dumpは201KBのようです。

比較してみる

 twitter-cldr-rbは、RubyGemsからインストールできます。

$ gem install twitter-cldr-rb

 ここでは、元の文字列と読みをタブで区切った1行1項目のテキストから、日本語文字列照合順序でソートした元の文字列のリストを出力することにします。

 twitter-cldr-rbでは通常、照合順序にもとづいたソートには、ArrayからLocalizedArrayを作ってsortメソッドを呼び出します。が、そのままでは「元の文字列と読みからなるHashを、読みでソートする」ということができません。

 そこで、1つ下のレイヤーのメソッドを呼び出してソートします。

#!/usr/bin/env ruby

require 'twitter_cldr'

JACOL = TwitterCldr::Collation::Collator.new(:ja)

def sort_kana_cldr_by(enum)
  enum.sort_by {|x| JACOL.get_sort_key(yield(x)) }
end

alldat = []

ARGF.each_line do |line|
  word, yomi = line.chomp.split(/\t/)
  alldat << { word: word, yomi: yomi }
end

sort_kana_cldr_by(alldat) {|x| x[:yomi]}.each do |x|
  puts x[:word]
end

 比較対象として、sort_kana_jisx4061でも同じ働きをするものを作ります。

#!/usr/bin/env ruby

require 'sort_kana_jisx4061'

alldat = []

ARGF.each_line do |line|
  word, yomi = line.chomp.split(/\t/)
  alldat << { word: word, yomi: yomi }
end

sort_kana_jisx4061_by(alldat) {|x| x[:yomi]}.each do |x|
  puts x[:word]
end

 この両方に手持ちのデータをかけた結果、同じ出力になることを確認しました。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1451-14a19771

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad