はじめに
日常生活で「道路標識」や「ラインのスタンプ」等, 様々な箇所で(広義の)象形文字を目にする.
そんな象形文字の代表的存在の一つがトンパ文字である.
wikipedia曰く
現在、世界で唯一の「生きた象形文字」とされる
とのことであり, シェアNo1・独占状態 の象形文字である.
こんな象形文字界のiPhoneであるトンパ文字をlineのスタンプのように気軽に打てたら......と思いそんなコードを作成した
トンパ文字データセットの作成
まずはじめにトンパ文字の本をPDF化し, 領域を切り抜くことで各トンパ文字の画像ファイルを作成した.
次に日本語と紐づけるために, Tesseract-OCRで下部の文字を読み取った.
以下コードの概要
def imgToStrOCR(img,lang="jpn",tesseract_layout=6):
path_ocr = r"C:\Program Files (x86)\Tesseract-OCR"
if path_ocr not in os.environ["PATH"].split(os.pathsep):
os.environ["PATH"] += os.pathsep + path_ocr
tool = pyocr.get_available_tools()[0]
result = tool.image_to_string(
img, lang=lang, builder=pyocr.builders.TextBuilder(tesseract_layout=tesseract_layout)
)
return result
最後にOCRに間違いが多いため, 手動でそこを修正した.
プログラムの流れについて
- 検索欄に単語を入力
- それに近いトンパ文字を表示
- その画像をクリップボードに格納
- 貼り付け
を想定
1,2に関しては各単語をmecabで分かち書きしword2vecで類似語を探すという処理をした.
mecabを使った分かち書きについて
mecabを用いることで, 入力した日本語を各単語に分割しその品詞等の情報を得ることができる.
今回は, 文を品詞で分解したあと, 助詞と助動詞と記号を除外した.
例えば「今日は晴れだ」という文章があったら.
分かち書きをし助詞等を除外することで「今日」「晴れ」という2単語に変換した.
以下コードの概要
import MeCab
m = MeCab.Tagger()
def text_to_words(text):
lines = [
line for line in m.parse(text).split('\n')
if (
"\t助詞" not in line
) and (
"\t助動詞" not in line
) and (
"\t記号" not in line
) and (
line != 'EOS'
) and (
line != ''
)
]
return [re.split('[\t,]',line)[0] for line in lines]
word2vecについて
各単語の共起性から, 単語をベクトル化するアルゴリズムをword2vecという.
ベクトル化した単語のcos類似度が高いものほど, より意味が近い単語になりがちだと知られている.
入力された単語のベクトルの和とcos類似度の高いトンパ文字を抽出することで, それっぽいトンパ文字検索を実装した.
プログラムの実装について
word2vecをそのまま実装してしまうと, word2vecの学習データがすべてメモリに乗るため起動に数十秒の時間がかかる.
また, 常駐型ファイルにすると, 常にメモリ上にGBオーダーのデータが残り続けることになる.
その問題を解決するため, word2vecをローカルファイルから高速で読み書きが可能なSQLファイルに変換を行った.
具体的には
[単語],[ベクトル要素1],[ベクトル要素2],[ベクトル要素3],......
というDBをword2vecの学習済みファイルから作成し, そこから読み書きを行うように実装した.
これにより, 実装時の起動時間が2秒に短縮した.
また, 細かなGUIの実装はtkinterで行った.
結論
トンパ文字をより気軽に送れるようになった