uribo / zipangu

Japanese utility functions and data
https://uribo.github.io/zipangu
Other
56 stars 7 forks source link

Convert prefecture's names between japanese and roman #47

Closed Doubt-0KB closed 2 years ago

Doubt-0KB commented 2 years ago

都道府県について、日本語とローマ字との相互変換があると便利だと思いますがどうでしょうか? (下の関数は厚労省の新型コロナに関するオープンデータの前処理用に組んだので、All=全国を変換するための操作も入れています)

convert_prefecture <- function(x, to){
  x <- enc2utf8(as.character(x)) #Encoding to UTF-8
  y <- c(zipangu::jpnprefs$prefecture, "All")
  z <- c(zipangu::jpnprefs$prefecture_kanji, enc2utf8("全国"))

  if(to=="kanji"){
    if(any(is_prefecture(x)|x=="全国")) 
      stop("日本語表記が含まれています") #check:is Japanese
    x <- str_to_sentence(x) #Convert to sentence

    for(i in 1:length(x)){
      if(!any(str_detect(y, x[i]))) 
        stop("存在しない地域が含まれています") #check;is Japan
      x[i] <- z[str_detect(y, x[i])] #Convert romen to japanese
    }
  } else if(to=="roman"){
    if(any(!is_prefecture(x) & x!="全国")) 
      stop("日本語表記以外が含まれています") #check:is Japanese
    x <- harmonize_prefecture_name(x, to="long")

    for(i in 1:length(x)){
      if(!any(str_detect(z, x[i]))) 
        stop("存在しない地域が含まれています") #check;is Japan
      x[i] <- y[str_detect(z, x[i])] #Convert romen to japanese
    }
  } else {
    stop("toが正しくありません")
  }

  return(x)
}

convert_prefecture(c("東京", "大阪府", "北海道", "全国"), to="roman")
#> [1] "Tokyo-to" "Osaka-fu" "Hokkaido" "All"

convert_prefecture(c("tokyo", "osaka", "ALL", "TOKYO"), to="kanji")
#> [1] "東京都" "大阪府" "全国"   "東京都"
uribo commented 2 years ago

「全国」まで含めた機能の提案、ありがとうございます。 漢字からローマ字、ローマージから漢字への変換関数を2つ作り、それを利用する形でさらに1つの関数にまとめることは可能でしょうか。 (convert_prefecture_to_kanji, convert_prefecture_to_roman, convert_prefectureの3つの関数のイメージです)

また、harmonize_prefecture_name()で実装されていないので難しいかもしれませんが、漢字表記以外(ひらがな、カタカナ)での都道府県名変換が実現できると嬉しく思います。この点についても一考いただけますと幸いです。

Doubt-0KB commented 2 years ago

漢字⇔ローマ字の変換関数はこういった形でどうでしょうか?

convert_prefecture_to_kanji <- function(x){
  x <- enc2utf8(as.character(x)) #Encoding to UTF-8
  if(any(is_prefecture(x)|x=="全国")) stop("日本語表記が含まれています") #check:is Japanese

  x <- str_to_sentence(x) #Convert to sentence
  y <- c(zipangu::jpnprefs$prefecture, "All") #Add all
  z <- c(zipangu::jpnprefs$prefecture_kanji, enc2utf8("全国")) #Add 全国

  for(i in 1:length(x)){
    if(!any(str_detect(y, x[i]))) stop("存在しない地域が含まれています") #check;is Japan
    x[i] <- z[str_detect(y, x[i])] #Convert roman to japanese
  }
  return(x)
}

convert_prefecture_to_roman <- function(x){
  x <- enc2utf8(as.character(x)) #Encoding to UTF-8
  if(any(!is_prefecture(x) & x!="全国")) stop("日本語表記以外が含まれています") #check:is Japanese

  x <- harmonize_prefecture_name(x, to="long")
  y <- c(zipangu::jpnprefs$prefecture, "All")
  z <- c(zipangu::jpnprefs$prefecture_kanji, enc2utf8("全国"))

  for(i in 1:length(x)){
    if(!any(str_detect(z, x[i]))) stop("存在しない地域が含まれています") #check;is Japan
    x[i] <- y[str_detect(z, x[i])] #Convert japanese to roman
  }
  return(x)
}

convert_prefecture <- function(x, to){
  if(to=="kanji"){
    convert_prefecture_to_kanji(x)
  } else if(to=="roman"){
    convert_prefecture_to_roman(x)
  } else {
    stop("toが正しくありません")
  }
}

convert_prefecture(c("tokyo", "osaka", "ALL"), to="kanji")
#> [1] "東京都" "大阪府" "全国"

convert_prefecture(c("東京", "大阪府", "北海道", "全国"), to="roman")
#> [1] "Tokyo-to" "Osaka-fu" "Hokkaido" "All"

ひらがな・カタカナからの都道府県名変換についても同様の形式で(少々無理矢理ですが)作ってみました。 「きょうと」と「とうきょうと」の競合を避けるために追加で処理を噛ませています。

convert_prefecture_from_hirakana <- function(x){
  x <- enc2utf8(as.character(x)) #Encoding to UTF-8

  x <- str_conv_hirakana(x, to="hiragana") #Convert to hiragana
  x <- str_c("^", x) #Avoid conflicts between きょうと and とうきょうと

  y <- enc2utf8(c("ほっかいどう","あおもりけん","いわてけん","みやぎけん","あきたけん","やまがたけん",
                  "ふくしまけん","いばらきけん","とちぎけん","ぐんまけん","さいたまけん","ちばけん",
                  "とうきょうと","かながわけん","にいがたけん","とやまけん","いしかわけん","ふくいけん",
                  "やまなしけん","ながのけん","ぎふけん","しずおかけん","あいちけん","みえけん",
                  "しがけん","きょうとふ","おおさかふ","ひょうごけん","ならけん","わかやまけん",
                  "とっとりけん","しまねけん","おかやまけん","ひろしまけん","やまぐちけん","とくしまけん",
                  "かがわけん","えひめけん","こうちけん","ふくおかけん","さがけん","ながさきけん",
                  "くまもとけん","おおいたけん","みやざきけん","かごしまけん","おきなわけん","ぜんこく"))
  z <- enc2utf8(c("北海道","青森県","岩手県","宮城県","秋田県","山形県",
                  "福島県","茨城県","栃木県","群馬県","埼玉県","千葉県",
                  "東京都","神奈川県","新潟県","富山県","石川県","福井県",
                  "山梨県","長野県","岐阜県","静岡県","愛知県","三重県",
                  "滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県",
                  "鳥取県","島根県","岡山県","広島県","山口県","徳島県",
                  "香川県","愛媛県","高知県","福岡県","佐賀県","長崎県",
                  "熊本県","大分県","宮崎県","鹿児島県","沖縄県","全国"))

  for(i in 1:length(x)){
    if(!any(str_detect(y, x[i]))) stop("存在しない地域が含まれています") #check;is Japan
    x[i] <- z[str_detect(y, x[i])] #Convert romen to japanese
  }

  return(x)
}

convert_prefecture_from_hirakana(c("トウキョウト", "おおさか"))
#> [1] "東京都" "大阪府"

convert_prefecture_from_hirakana(c("キョウト", "おおさか"))
#> [1] "京都府" "大阪府"
uribo commented 2 years ago

ありがとうございます。コードの詳細はPRをお送りいただければ確認します。

ひらがな・カタカナからの都道府県名変換の関数についてもご提案ありがとうございます。 このままでも良いですが、入力に与えられた都道府県名が短い(大阪、岡山など)時に、出力結果も入力値を反映して短いものにできるオプションがあると使い勝手が良いかと思いました。

# イメージとしては
convert_prefecture_from_hirakana(c("トウキョウ", "おおさか"), keep_original = TRUE)
#> [1] "東京" "大阪"
convert_prefecture_from_hirakana(c("トウキョウ", "おおさか"), keep_original = FALSE)
#> [1] "東京都" "大阪府"
Doubt-0KB commented 2 years ago

上記の関数について #48 にてPRをお送りしました。 初PRなので、記載方法などおかしな点があればご指摘いただけると幸いです。

ひらがな・カタカナからの都道府県名変換の追加オプションは確かに便利そうですね、追加で考えてみます。

Doubt-0KB commented 2 years ago

ひらがな・カタカナからの漢字変換ですが、ひとまず自動で変換元に合わせるよう修正してみました。 長さを任意に変えたい場合はharmonize_prefecture_name()を併用する形を想定しています。

convert_prefecture_from_hirakana <- function(x){
  x <- enc2utf8(as.character(x)) #Encoding to UTF-8

  x <- str_conv_hirakana(x, to="hiragana") #Convert to hiragana
  x <- str_c("^", x) #Avoid conflicts between きょうと and とうきょうと
  y <- enc2utf8(c("ほっかいどう","あおもりけん","いわてけん","みやぎけん","あきたけん","やまがたけん",
                  "ふくしまけん","いばらきけん","とちぎけん","ぐんまけん","さいたまけん","ちばけん",
                  "とうきょうと","かながわけん","にいがたけん","とやまけん","いしかわけん","ふくいけん",
                  "やまなしけん","ながのけん","ぎふけん","しずおかけん","あいちけん","みえけん",
                  "しがけん","きょうとふ","おおさかふ","ひょうごけん","ならけん","わかやまけん",
                  "とっとりけん","しまねけん","おかやまけん","ひろしまけん","やまぐちけん","とくしまけん",
                  "かがわけん","えひめけん","こうちけん","ふくおかけん","さがけん","ながさきけん",
                  "くまもとけん","おおいたけん","みやざきけん","かごしまけん","おきなわけん","ぜんこく"))
  z <- enc2utf8(c("北海道","青森県","岩手県","宮城県","秋田県","山形県",
                  "福島県","茨城県","栃木県","群馬県","埼玉県","千葉県",
                  "東京都","神奈川県","新潟県","富山県","石川県","福井県",
                  "山梨県","長野県","岐阜県","静岡県","愛知県","三重県",
                  "滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県",
                  "鳥取県","島根県","岡山県","広島県","山口県","徳島県",
                  "香川県","愛媛県","高知県","福岡県","佐賀県","長崎県",
                  "熊本県","大分県","宮崎県","鹿児島県","沖縄県","全国")) #Prefecture(long)
  w <- enc2utf8(c("北海道","青森","岩手","宮城","秋田","山形",
                  "福島","茨城","栃木","群馬","埼玉","千葉",
                  "東京","神奈川","新潟","富山","石川","福井",
                  "山梨","長野","岐阜","静岡","愛知","三重",
                  "滋賀","京都","大阪","兵庫","奈良","和歌山",
                  "鳥取","島根","岡山","広島","山口","徳島",
                  "香川","愛媛","高知","福岡","佐賀","長崎",
                  "熊本","大分","宮崎","鹿児島","沖縄","全国")) #Prefecture(short)

  for(i in 1:length(x)){
    if(!any(str_detect(y, x[i]))) stop("存在しない地域が含まれています") #check;is Japan
    x[i] <- ifelse(any(str_detect(x, y)),
                   z[str_detect(y, x[i])], #Convert romen to japanese (long)
                   w[str_detect(y, x[i])]) #Convert romen to japanese (short)
  }

  return(x)
}

convert_prefecture_from_hirakana(c("トウキョウト", "キョウト", "おおさか"))
#> [1] "東京都" "京都" "大阪"
convert_prefecture_from_hirakana(c("トウキョウト", "キョウト", "おおさか")) %>% 
  harmonize_prefecture_name(to="long")
#> [1] "東京都" "京都府" "大阪府"