機械学習前にデータ成形をしてみた

この記事は「スパムFAXを画像解析+機械学習でブロックしてみた」の全6回のシリーズ記事の第4回です。

はじめに

前回の記事では【第3回】Fax画像でスパム分類したかった話を紹介しました。

今回は機械学習モデルに突っ込むための前処理の話をしていきます。

画像を綺麗に

今回の使用したFAXデータはtifのデータでなぜか形が潰れてました、、、

※色々な関係上モザイクを入れてます

こんな感じです。字読めなくはないけど、文字起こしできるかは微妙。けど情報は失われてなさそうだしA4サイズでresizeしたら綺麗になるんじゃね? resizeは簡単で以下のコードでできます。

from PIL import Image
img = Image.open('画像のパス')
scaled_img = img.resize((画像サイズ),'手法(BILINEARとか)')

リサイズした画像

きれいやん!?!? ※モザイクが取れてると普通に見えます

文字起こし(OCR)

pythonのライブラリでOCRがありました!!が、性能があまりにも良くないため不採用。 AWSも使いたかったけど日本語対応してないため、性能が良いと言われるGoogle APIのCloud Visionを使用しました。 検証として論文の画像を入れてみたところ、、、、

めっちゃいい精度でるやん。 FAXの場合は単語さえ取れれば最悪大丈夫なので採用。

いくぜいくぜ〜!

コードはこんな感じです

body = {
      "requests":[{
              "image":{
                   "content": 'base64で変換した画像'
               },
              "features":[{
                  "type":"TEXT_DETECTION",
                  "maxResults":1
               }]
        }]
      }
req_body = json.dumps(body)
res = requests.post('URL+自分のAPIキー', data=req_body)
text = result["responses"][0]["fullTextAnnotation"]["text"]

文字解析

さていよいよtextの状態になったので、解析に入ります。

解析にはjanomeを使用しました。分かち書きを行い、動詞、名詞、形容詞、副詞のみ取り出しました。

from janome.tokenizer import Tokenizer
text = '処理したいテキスト'
w_filter = ["動詞", "名詞", "形容詞", "副詞"]
t = Tokenizer()
wakati = " ".join([token.surface for token in t.tokenize(text)
                     if token.part_of_speech.split(",")[0] in w_filter])

ここで単語ごとに空白で繋げているのは、このあと機械学習モデルに入れやすくするためです。

これで前処理は終わりになります。あとはモデルに入れるだけ!

おわりに

次回は【第5回】スパムFAXを機械学習でブロックしてみたを作っていきたいと思います。

▼Faxのスパム分類シリーズ記事(全6回)