Skip to content

Instantly share code, notes, and snippets.

@bs90

bs90/blog.md Secret

Last active December 22, 2022 01:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bs90/730dec357ad875f38a2a206154d97104 to your computer and use it in GitHub Desktop.
Save bs90/730dec357ad875f38a2a206154d97104 to your computer and use it in GitHub Desktop.
自然言語処理・機械学習を実装した事例

自然言語処理・機械学習を実装した事例

はじめまして!株式会社Sun Asteriskでエンジニアをやっているチョンと申します!

この記事はSun* Advent Calendar 2022の22日目の記事です。

はじめに

機械学習分野がますます注目されていて、ますます重要になっています。私も8年前にSun Asteriskで参加したプロジェクトで自然言語処理と機械学習を導入する機会がありましたので、本記事ではその事例について分かりやすく共有できればと思います。

課題

この事例では、以下の画像のように、特定のHTML記事を入力として、コンテンツ解析を行って、DBから関連記事を検索したり、自動的にカテゴリを分類する必要がありました。

課題

これらの機能につては自然言語処理・機械学習の手法を使って実装しました。本記事では深い処理までではなく、実装アプローチの所だけを共有したいと思います。

アプローチ

アプローチはこんな感じで、学習パートと応用パートがあります。

アプローチ

学習パートは大きく分けて

  • 長期間コンテンツ収集
  • 形態素解析処理
  • 特徴語抽出
  • 学習モデル作成

の4つの処理があります。それぞれについて説明いたします。

長期間コンテンツ収集

長期間コンテンツ収集

機械学習には信頼度が高い学習データが多く必要です。SNSやRSSなどから2年間で1000万件以上のHTML記事を収集しましたが、コンテンツ解析の信頼度を高めるため、記事のメインコンテンツの部分のみ抽出する必要がありました。一般のHTML記事にはメインコンテンツ以外、ヘッダー・フッターや関連記事枠などの不要な部分があり、コンテンツ解析する前にそれらの部分を外しておかないといけないということです。そうするためには、試行錯誤により特別扱いが必要なHTML構成のパターンを記録し、それらのパターンにそって処理を行いました。

形態素解析処理

形態素解析とは?

簡単に言うと、特定の文書に入っている単語とその品詞を解析することです。

例えば、「私はSunAsteriskのエンジニアで、日本のことが大好きなベトナム人です。」の文の解析結果はこんな感じです。

形態素解析の例

今回の事例の場合、記事のトピック(どこ、誰、何などの情報)を判定する必要がありましたが、それは記事に入ってる名詞でほぼ判定できるため、解析結果のうち名詞だけ利用しました。

名詞だけ残す

特徴語抽出 TF-IDF手法導入

名詞だけ残しても、残っている単語がまだ多くありますし、どの単語のほうが重要なのか分からない状況です。この段階で、初めての学習モデルを作成しはじめました。これはTF-IDF学習モデルと言います。

TF-IDF学習モデル

TF-IDF(term frequency–inverse document frequency)手法とは?

特定の文書に含まれる単語の重要度を評価できる手法です。公式は以下の通りですが、簡単に概要を説明すると、本記事にはたくさん出ていて、他の記事にはまあり出てこない単語の重要度を高くするというイメージです。

TF-IDF

TF-IDF学習モデルに何を記録したかというと、単純に学習コンテンツの中に何の単語が何回出てきたかの集計データだけでした。学習データが充分な件数になったらTF-IDFで単語の重要度を計算出来まます。その計算ができてからそれぞれの記事に対して、重要度が高い上位20件を 「特徴語」 と呼んで、データベースにも保存しました。

単純ベイズ確率モデル

特徴語を抽出できてから、もうひとつの学習モデルを作成しました。名前は単純ベイズ確率モデルです。

NaiveBayes

最初から「テクノロジー」、「スポーツ」、「ビジネス」などのカテゴリの集合を定義して、それぞれの学習コンテンツに最適なカテゴリをアサインしておきました。この学習モデルに何を学習させたかというと、各特徴語がそれぞれのカテゴリに何回出来きたかの集計データです。モデルの名前もどういうふうに応用できるかも応用パートで説明します。

特徴語抽出の例

これで学習パートについての説明が終わりましたので、特徴語抽出の例を一つ出したいと思います。特徴語だけをみてもだいたい記事のトピックを判断出来ますね!

特徴語の事例

では、これから応用パートについて説明します。

応用パート 関連記事検索

関連記事

まずは関連記事検索についてですが、2つの記事の類似度を計算する必要があります。2つの単語の集合を2進数に変換して、類似度を高速で計算できるb-bit minwise hashingという手法を使いました。

記事Aの関連記事を検索する流れとしては、Aと同じ特徴語を持つ記事をデータベースから検索して、それぞれのペアの類似度を計算して、類似度は0.4~0.8であれば関連記事として判定しました。0.8以上をカウントしないのは同記事の可能性が高いからです。

応用パート カテゴリ自動分類 単純ベイズ分類器

NaiveBayesClassification

公式はこの画像の通りですが、単純ベイズ分類器を深く理解するために「バイズ定理」や「単純バイズ」などの理論の理解が必要です。簡単に説明すると単純ベイズ分類器は確率的な分類器で、特定の記事が特定のカテゴリの記事である確率を、そのカテゴリの中にその記事の各特徴語が出て来る確率で計算出来るものです。「テクノロジー」のカテゴリによく出てくる単語をたくさん持っている記事は「テクノロジー」の記事である可能性が高いことです。

学習パートで説明した単純ベイズ確率モデルができた前提で、公式にある部分的な確率を簡単に計算できて、カテゴリ自動分類機能を実装できました。

おわりに

間違いなく機械学習の時代になっています。難しい分野ですが、私みたいに簡単なところから実際にやってみると意外と楽しいと思います。皆さんも機会があればぜひ試してください。

参考URL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment