ナイーブベイズで文字化けの種別を判定する。

2018-07-28
python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92scikit%20learn%E3%83%99%E3%82%A4%E3%82%BA%E3%83%8A%E3%82%A4%E3%83%BC%E3%83%96%E3%83%99%E3%82%A4%E3%82%BA
    

目次

背景

古い構成のシステムとかだとソースコード、HTMLの雛形、DB、内部処理のエンコード形式など文字コードがバラバラなんて言うことがある。 euc-jpとshift-jisが混ざってる上にターミナルやvimのエンコードでぐちゃぐちゃ下文字列を見る時の気分は最悪だ。 と言うわけで、コピペするだけでどの文字化けを解くのが目的。 http://lab.kiki-verb.com/mojibakeratta/ (もじばけらった)とか こう言うものもあるが、スマートで一発に解くのが目的。兼、機械学習のお勉強。

概要

scikit-learnのナイーブベイズ分類器を使って、エンコードされてしまった文字列を解析する。

scikit-learnとナイーブベイズ

ナイーブベイズ分類器はいくつか用意されており、その中でもシンプルなガウシアンを利用する。 65535種類あるUTF-8の中から、どんな文字が多く出現しているかをカウントしていく方法で分類

対象とする文字化け

学習データ

# 元の文字コード エンコードした文字コード
1 shift-jis utf-8 「縺薙l縺ッUTF-8縺ョ繝・く繧ケ繝医〒縺吶よ怙霑代・谿・←縺薙l縺ァ縺吶・縲」
2 euc-jp utf-8 「ホ・ニ・ュ・ケ・ネ、ヌ、ケ。」、ス、・ハ、熙ヒハリヘ」
3 utf-8 shift-jis 「$l$O(Jiso-2022-jp$B$N%F%-%9%H$G$9!#(JJIS$B$H$b8@$C$?$j$7$^$9!#EE;R%a!<%」
おまけ1 - - 「This is plane text」 ※英語として分類
おまけ2 - - 「この文章は日本語で書かれています」 ※日本語として分類

分類するデータ

arr = [
    "これはUTF-8のテキストです。最近は殆どこれですね。",
    "代・谿・←縺薙l縺ァ縺吶・縲",
    "Hello World",
    "euc-jp、ホ・ニ・ュ・ケ・ネ、ヌ、ケ。」、ス、・ハ、熙ヒハリヘタ、テ、ソ、ホ、ヌ、゙",
    "$B$N%F%-%9%H$G$9!#(JJIS$B$H"
]

結果

['ja-jp'] これはUTF-8のテキストです。最近は殆どこれですね。
['shift-jis->utf-8'] 代・谿・←縺薙l縺ァ縺吶・縲
['en'] Hello World
['euc-jp->utf-8'] euc-jp、ホ・ニ・ュ・ケ・ネ、ヌ、ケ。」、ス、・ハ、熙ヒハリヘタ、テ、ソ、ホ、ヌ、゙
['utf-8->shift-jis'] $B$N%F%-%9%H$G$9!#(JJIS$B$H

となった。 データが集めがザルだったが、それっぽく分類できるのは確認できた。 APIにするのも難しくなさそう。

ソース

import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

def count_codePoint(str):
  counter = np.zeros(65535)
  
  for i in range(len(str)):
    code_point = ord(str[i])
    if code_point > 65535 :
      continue
    counter[code_point] += 1
   
  counter = counter/len(str)
  return counter

ja_str = '縺薙l縺ッUTF-8縺ョ繝・く繧ケ繝医〒縺吶よ怙霑代・谿・←縺薙l縺ァ縺吶・縲'
en_str = ' This is English Strings.'

x_train = [
    count_codePoint('This is plane text'),
    count_codePoint('この文章は日本語で書かれています'),
    
    count_codePoint('縺薙l縺ッUTF-8縺ョ繝・く繧ケ繝医〒縺吶よ怙霑代・谿・←縺薙l縺ァ縺吶・縲'), 
    count_codePoint('ホ・ニ・ュ・ケ・ネ、ヌ、ケ。」、ス、・ハ、熙ヒハリヘ'),
    count_codePoint('$l$O(Jiso-2022-jp$B$N%F%-%9%H$G$9!#(JJIS$B$H$b8@$C$?$j$7$^$9!#EE;R%a!<%'),
    count_codePoint('$N%F%-%9%H$G$9!#(JJIS$B$H$b8@$C$?$j$7$^$9!#EE;R%a!<')
]

y_train = [
    'en',
    'ja-jp',
    
    'shift-jis->utf-8',
    'euc-jp->utf-8',
    'utf-8->JIS',
    'utf-8->shift-jis',
]

#学習
clf = GaussianNB()
clf.fit(x_train, y_train)

arr = [
    'これはUTF-8のテキストです。最近は殆どこれですね。',
    '代・谿・←縺薙l縺ァ縺吶・縲',
    'Hello World',
    'euc-jp、ホ・ニ・ュ・ケ・ネ、ヌ、ケ。」、ス、・ハ、熙ヒハリヘタ、テ、ソ、ホ、ヌ、゙',
    '$B$N%F%-%9%H$G$9!#(JJIS$B$H'
]

for i in arr:
  sub_arr = [count_codePoint(i)]
  y_pred = clf.predict(sub_arr)
  print(y_pred,i)[/python]

参考

http://labs.timedia.co.jp/2010/12/identifying-electronic-ghosts.html

    
s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV

関連記事

Selenium + Python でYahooのログインや検索・メールの操作を自動化する。
環境 Selenium環境の構築 Seleniumのインストール 検証 Yahoo検索する Yahooにログイン/ログアウトする Yahooメールの操作〜ゴミ箱を空にする サンプルソース 参考 Selenium + PythonでYahoo…

エンジニアなMacBookのセットアップ 開発環境の構築
ブラウザ関連 Homebrewのインストール ターミナル環境系 Hyper エディタ VSCode typora CLIツール Git 言語系 Python node.js MacBookPro…

OpenCV.jsを動かしてみる + デモ
環境 OpenCV.jsのセットアップ サンプルソース グレースケール 2値化 Cannyエッジ 輪郭抽出 ガウシアン デモ OpenCV.jsを試してみました。 環境 OpenCV.js v4.1.0 OpenCV.jsのセットアップ OpenCVをWasm…

画像のプーリング処理 canvas + JavaScript
プーリング処理について サンプルソース デモ 参考文献 JavaScriptで画像のプーリング処理を行ってみました。 プーリング処理について プーリングは畳み込みに似た処理で、CNN…

JPG画像を圧縮する OpenCV + Python
環境 説明 ソース セットアップ 実験 ブログなどにアップする画像を比較的簡単に圧縮する方法がないか探していたところ、 PythonとOpenCVで簡単に実装出来そうでした。 そこで、Python + OpenCV…

Python + OpenCVで顕著性 (saliecy) マップを実装
顕著性マップ OpenCVに用意されている3つの顕著性検出アルゴリズム Static saliency StaticSaliencySpectralResidual_create() StaticSaliencyFineGrained_create…

Python + OpenCVのfillConvexPolyで複雑なポリゴンを描画する
サンプル fillPolyと何が違うのか 参考 Python + OpenCVのfillConvexPoly…

Python+OpenCVで任意の画像領域:ROIのみに処理 マスク画像を使って
やりたいこと(やったこと) 実装方法 Python + OpenCVで任意の画像領域のみに処理を加えるサンプルを1つ紹介します。 やりたいこと(やったこと) こんな感じで、任意の画像領域(矩形でなくてもよい)のみをグレースケール、…

OpenCVのチャンネルエラー対処: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'binary_op'
詳細 参考 Python + OpenCVのスクリプトを書いていたところ、タイトルにあるようなエラーが出現しました。 結果的にはnumpyの配列のサイズが異なるのが原因だったようです。 詳細 下記のソースはPython…

顔のランドマーク検出とドロネー分割 Python + OpenCV + dlib
環境 デモ サンプルソース 実行結果 リアルタイムでカメラ画像を利用する場合 説明 dlib Subdiv2D 参考 Python + OpenCV + dlib…

最新の投稿

JavaScriptの配列ショートハンド (AtCoder用)

JavaScriptでワーシャルフロイド法を実装
AtCoder ABC012 D問題 D - バスと避けられない運命 解説 実装 AtCoder ABC012 の D問題でワーシャルフロイド法が利用できる問題が出てきたので、 JavaScriptで実装しました。 AtCoder ABC012 D問題 D…

GitHub Actions で Gatsby をビルドし Amazon S3 にデプロイする
GitHub Actions について あらかじめ準備しておくもの AWS IAM ユーザを環境変数にセットする workflowの記述 ビルド バッジを利用する 終わりに 参考にしたところ Gatsbyで作った静的サイトを、GitHub Actions…

cloudinaryによる画像ファイルの管理 はじめてみる
目的 cloudinary について 他のサービスとの比較 料金プラン アカウントの登録 利用してみる ダッシュボード 画像の編集 APIベースでのアクセス 感想 参考 画像の管理や配信、さらには加工といった事ができるsaas型のcloud…

JavaScriptによる2分探索(バイナリサーチ) のサンプルコード
2分探索について ソース 参考 JavaScriptで2分探索(バイナリサーチ)を実装してみました。…

Vue.jsで作成された、ちょっと面白くて役立ちそうなサービス
UIコンポーネント VueSocial CKEditor 5 Vue.Draggable Vuetable 2 vuejs-datepicker Kalendar Vue Apexcharts Vue.js Google Charts vue-cart WebIDE…

GitHubのリポジトリをGitLabに同期する GitLabのミラーリング機能
GitLabのミラーリングについて GitHubのリポジトリをGitLabに反映する その他 参考 GitLabのミラーリング機能によりGitHubなどの外部のリポジトリとのミラーリングを行うことができます。 これを使ってGitHub…

WordPressやめます Gatsbyに移行しました
これまでのWordPress運用 なぜWordPressを捨てるのか? なぜGatsbyを利用するのか? gatsbyについて WordPressから記事の救出 移行対象記事の抽出 記事の置換 Gatsbyテーマの作成 Gatsby…

WordPressのDBから記事データを抽出する
WordPressのDB関連図 公開記事一覧の取得 タグ・カテゴリの取得 サムネイルの取得 おまけ: PHPスクリプト化しました 参考にしたところ WordPressにため込んだデータMarkdown化しGatsby…

ハイフンとかマイナスとかダッシュとか

Tags

Dates

© 2020   404 motivation not found