業務の効率をするにあたり文章を解析して項目事に分類する必要がありました。
ただ、構造が統一されていない文章から単語を抜き出して対象項目と整合性をマッチングするのはプログラムでは難しいと考え機械学習を活用する結論になりました。
自然言語処理を行うにあたりMeCabやAmazon Comprehendなどがありますが構築の手間と日本語解析の精度を検証したらGoogleのNatural Languageが良かったので採用しました。
Natural LanguageにはNatural Language APIとAutoML Natural Languageがあり、今回はこの2つを使用しました。
Natural Language APIは既に学習済みのモデルで文章を渡すと形態素解析や感情分析などを行った結果を返してくれます。
AutoML Natural Languageは指定された形式に沿って作成したデータを学習させる事ができ、独自の機械学習モデルが作成できます。
利用用途してはNatural Language APIで文章を形態素解析して単語を抽出し、プログラムで余分な単語を排除します。
排除した単語をつなぎ合わせてAutoML Natural Languageで独自に学習したモデルの分類器に与えます。
分類器から、どの項目になるかの予測結果を取得し80%以上なら対象項目に分類するように判断するフローにしました。
日本語は「ひらがな、カタカナ、漢字、数値、英字、記号」と要素が多く形態素解析が難しいですが、Natural Language APIは文章内の単語を抽出しているので精度はかなり高いです。
AutoML Natural Languageは用意する学習データに影響されてしまうので一概には判断できませんが、少ない学習データや多少の微妙なデータで、まあまあの精度がでました。
利用方法は公式サイトのドキュメントや検索すると参考サイトが多くあり、導入は難しく無かったです。
ただ、学習データを作成する時に1つの文章または単語に複数のラベルを付ける方法がドキュメントなどに掲載して無く見つけるのに時間がかかったので紹介します。
AutoML Natural Languageでは学習データの文章や単語などをアイテムと呼び、このアイテムを重複するとインポートの時にエラーとなりトレーニングができません。
例えば、概要文をアイテムにした場合に内容によっては複数のラベルが含まれていたりしますが、1アイテムに1ラベルでトレーニングデータを作成するとアイテムが重複してエラーとなります。
学習データはCSVで下記の形式で作成します。
"アイテム1","ラベル1"
"アイテム2","ラベル2"
"アイテム3","ラベル3"
例えば、「アイテム1」に「ラベル4」を付けたい場合に下記だとエラーになります。
"アイテム1","ラベル1"
"アイテム1","ラベル4"
"アイテム2","ラベル2"
"アイテム3","ラベル3"
この場合は下記のようにします。
"アイテム1","ラベル1","ラベル4"
"アイテム2","ラベル2"
"アイテム3","ラベル3"