12/08/2018, 10:53

Convert giữa các hệ chữ Nhật với gem Mojinizer

**Nguồn:** https://github.com/ikayzo/mojinizer - Gem giúp chuyển đổi giữa các hệ chữ Hiragana, Katakana, Romaji. - Chuyển đổi giữa các kiểu input Zenkaku và Hankaku. 1. Cài đặt gem 'mojinizer' 2. Sử dụng Các method được sử dụng để convert và detect đã được thêm vào class String sau khi ...

**Nguồn:** https://github.com/ikayzo/mojinizer - Gem giúp chuyển đổi giữa các hệ chữ Hiragana, Katakana, Romaji. - Chuyển đổi giữa các kiểu input Zenkaku và Hankaku.

1. Cài đặt

gem 'mojinizer'

2. Sử dụng

Các method được sử dụng để convert và detect đã được thêm vào class String sau khi cài đặt gem. Do đó, ta có thể gọi thông qua String object's method.

Conversation

  • Hirakana/Katakana -> Romaji:
"つくえ".romaji #=> "tsukue"
"ツクエ".romaji #=> "tsukue"
  • Katakana/Romaji -> Hiragana:
"ツクエ".hiragana #=> "つくえ"
"tsukue".hiragana #=> "つくえ"
  • Hiragana/Romaji -> Katakana:
"つくえ".katakana #=> "ツクエ"
"tsukue".katakana #=> "ツクエ"
  • Hiragana <-> Katakana
"つくえ".hira_to_kata #=> "ツクエ"
"ツクエ".kata_to_hira #=> "つくえ"
  • Chuyển đổi giữa kiểu Hankaku <-> Zenkaku:
"アロハ".han_to_zen #=> "アロハ"
"abc".han_to_zen #=> "abc"
"アロハ".zen_to_han #=> "アロハ"
"abc".zen_to_han #=> "abc"

Detection method

Các hàm detection giúp kiểm tra chuỗi truyền vào thuộc kiểu Hiragana, Katakana, ... trả về giá trị true, false.

  • Toàn bộ chuỗi là kiểu Hiragana/Katakana ?
"アロハ".kana? #=> true
"abc".kana? #=> false
"アロハ".katakana? #=> true
"アロハ abc".katakana? #=> false
"すし".hiragana? #=> true
"Let's eat すし".hiragana? #=> false
  • Với detection method có thể áp dụng kiểm tra kiểu Kanji.
"東京都".kanji? #=> true
"東京都だよ".kanji? #=> false
  • Kiểu Hankaku/Zenkaku/ASCII zenkaku.
"アロハ".hankaku? #=> true
"アロハ".hankaku? #=> false
"アロハ".zenkaku? #=> false
"アロハ abc".zenkaku? #=> true
"アロハ abc".ascii_zenkaku? #=> false
"abc".ascii_zenkaku? #=> true
  • Toàn bộ chuỗi có là chữ Nhật?
"東京都".japanese? #=> true
"abc".japanese #=> false
  • Check nội dung bên trong chuỗi có tồn tại kiểu Kana, Zenkaku, ... hay không. Trả về true, false.
"アロハ everybody".contains_katakana? #=> true
"Let's eat すし".contains_katakana? #=> false
"アロハ everybody".contains_hiragana? #=> false
"Let's eat すし".contains_hiragana? #=> true
"金曜日だよ".contains_kanji? #=> true
"アロハ everybody".contains_hankaku? #=> true
"Let's eat すし".contains_hankaku? #=> false
"アロハ everybody".contains_zenkaku? #=> false
"Let's eat すし".contains_zenkaku? #=> true
"Let's eat すし".contains_japanese? #=> true
"It's Friday, Friday".contains_japanese? #=> false

3. Demo

- Giả sử:

  • Ta có thông tin được crawler từ nhiều nguồn khác nhau.
  • Vì có khả năng xảy ra trùng lặp nên cần so sánh các thông tin.
  • Vì cùng 1 thông tin nhưng sử dụng khác kiểu chữ sẽ không thể so sánh chính xác được.

- Yêu cầu xử lý trước khi so sánh:

  • Thống nhất chữ hoa chữ thường => chữ hoa.
  • Thống nhất kiểu chữ sang Hiragana.
  • Thống nhất sử dụng kiểu input Zenkaku.
def crawler
	...
    return name_array
    #name_array = ["シー・コネクト", "イー・スピリット", "ポリゴン・ピクチュアズ", "dPARK", "アイノグラフィックス", "dPark", "アンビション", "しー・こねくと"]
end

Bằng mắt thường có thể thấy phẩn tử của mảng - シー・コネクト (katakana) tương đương しー・こねくと (hiragana) - dPARK (hankaku) tương đương dPark (zenkaku)

Nhưng vì khi nhập liệu sử dụng kiểu chữ và input khác nhau, nên khi ta so sánh sự trùng lặp sẽ bị bỏ sót.

"シー・コネクト" == "しー・こねくと" #false
"dPARK" == "dPark" #false

Xử lý dữ liệu:

def crawler
	...
    return name_array
end

def convert_name
	name_array = crawler
    name_array.each do |name|
      name = name.mb_chars.upcase.to_s
      name = name.hiragana unless name.hiragana?
      name = name.han_to_zen unless name.zenkaku?
      @convert_array << name unless new_array.include? name
    end
end

Kết quả sau khi xử lý và so sánh:

Name_array Convert_array
シー・コネクト => しー・こねくと
イー・スピリット => いー・すぴりっと
ポリゴン・ピクチュアズ => ぽりごん・ぴくちゅあず
dPARK => DPARK
アイノグラフィックス => あいのぐらふぃっくす
dPark => DPARK (trùng lặp-loại)
アンビション => あんびしょん
しー・こねくと => しー・こねくと (trùng lặp-loại)
0