まともな簡体字・繁体字変換

まともな簡体字・繁体字変換(以下、簡繁変換)を作りました。*1

https://jfconv.netlify.app/


なぜ、 まともと言うのか?

それは、簡繁変換というのは一対多変換であって、それを正しくできていない(しようともしていない)変換というのはまともではないからです。

まともでない簡繁変換

例えば、日本語にもある単語で例を挙げると、「乾燥」「幹部」「干涉」というものがあります。

簡体字では「乾」「幹」は「干」になるので、これらは「干燥」「干部」「干涉」と書かれます。

これらを繁体字に変換すると、「乾燥」「幹部」「干涉」に戻ってほしいところです。

それが、「簡体字 繁体字 変換」と検索して上位に出てくるサイトでこれらを変換しても、だいたいうまくいきません。

あるサイトでは、「幹燥」「幹部」「幹涉」となります。「干→幹」という単純な置き換えしかしていないということです。

また、別のサイトでは「乾/幹/榦燥」「乾/幹/榦部」「乾/幹/榦涉」となります。簡体字に対応する繁体字が複数ありうるということまでは認識しつつ、正しいものを選ぶ技術はないということです。*2

サイトによっては、「乾燥」「幹部」「干涉」と正しく変換されます。ただし、このようなサイトでも、例えば中国語の「能(できる)」を前につけて変換すると、「能干燥」が「能幹燥」になってしまいます。これは、中国語に「能幹」という単語があって、それが先にマッチしてしまっているからです。

こういう誤変換に対応するために、 中国語のWikipediaでは2万行以上あるリストをメンテナンスしています。

「面包」は「麵包」、一方で「面包括」なら「面包括」そのまま…。

こんなルールが数限りなくあるわけです。

できれば、こんなものを手で触ったりはしたくないところです。

まともな簡繁変換

ここで開発したのが、最初に紹介した簡繁変換です。

このページでは、例えば「能干燥」も「能乾燥」と正しく変換できます。

技術

この簡繁変換は、N-gramをベースにしています。

N-gram自体は一般的な技術なので、ここでの説明は省略します。


変換部分は、ずっと昔に記事を書いた可変次数N-gramデコードを使っています。

ソースはhttps://github.com/hiroshi-manabe/jfconv-scriptsで公開しています。

デコード部分のアルゴリズムは、KenLMというN-gramライブラリの状態(State)を使うことでかなりシンプルになっています。

処理時には、例えば「干面」という入力であればそれを「[乾|干|幹|榦] [面|麵]」という形に変換し、それをN-gramデコードが受け取って、最もそれらしい並びを選ぶ、という形になっています。

データ

私が使ったのは、簡体字はhttps://github.com/brightmart/nlp_chinese_corpusで紹介されている百科問答(Q&Aサイト)、繁体字は台湾のいろいろな小説サイトからクローリングしたものです。

背景

「なぜまともな簡繁変換が少ないのか」という疑問を持つ人がいるかもしれません。

これは、簡繁変換というのが、「あまり必要がないタスク」だからです。


簡体字圏の人はだいたい繁体字が読めますし、その逆もまたそうです。

もちろん、自分の慣れた文字のほうが読みやすいので簡繁変換というものがあるのですが、人間の脳は適応能力が高いので、多少変換が間違っていても補完して読むことができます。

そういう意味では、簡繁変換というのは、メジャーな自然言語処理タスク(翻訳、音声認識、音声合成等)と違って、真面目にやる動機に乏しいタスクなのです。

そういうわけで、大資本が真面目に取り組むということがないので、個人で頑張れば比較的いいものが作れるということになります。

といっても、「あまり必要がないタスク」であることに変わりはないので、自己満足のようなものですが。


このN-gramデコードはちょっとしたNLPタスクを解くのに便利なので、他にもいくつかツールを作ってみる予定です。

*1:簡体字・繁体字変換では、用語の言い換えをするものもありますが、ここではそれはしていません。

*2:「干」が繁体字でも「干」のままになることもあるということも見逃しています。