お手軽に英文文書にメタ情報を!!Pythonでgensimを使ったLDAに挑戦してみた。Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。2017-11-01お手軽に英文文書にメタ情報を!!Pythonでgensimを使ったLDAに挑戦してみた。webデザイナーこんにちは。白木(@YojiShiraki)です。前回はpolyglotを用いて英文から名詞を抽出する処理を行いました。今回は、その延長でLDAという手法にチャレンジしたいと思います。当社ではぼちぼち大量の自然文章データを取り扱っています。通常、これらのデータを読み解いてクライアントへの提案に繋げているのですが、概観を把握する場合は、膨大なデータを一つ一つ丁寧に読んでいる余裕などありません。なると、できる限りメタ情報を付与して、対象データの中身を読まずにだいたい把握するニーズが高くなりますが、残念ながら最初からデータに豊かなメタ情報が付与されているケースは稀であり、あってもカテゴリが一つ与えられているくらいです。そこで自分たちでメタ情報を付与できないか、ということでLDAをやってみたという流れです。LDAとは?ざっくり言うと、対象となる文書がどういったトピックによって構成されているかを推定する方法です。潜在的ディレクリ配分法と言われます。数学的な解説は他サイトに譲りまして、ここでは直感的にLDAがどういったものか解説します。ある文書があったときに、その文書のトピックとは何か、ということです。文書の主たるトピックを明らかにする例えばある野球ニュースがあったしましょう、この時、その文書(ニュース)がクライマックスシリーズのニュースであればトピックは「DeNA」「ソフトバンク」「試合結果」「ホームラン」といったところでしょうか。いった情報が把握できればニュースを全部読まなくてもだいたい何の話かわかりますよね。「なんだ楽勝じゃん」と思われるかもしれませんが注意点が二つあります。トピックは母集団となる文書群から抽出されるトピックは明確的には抽出できないどういうこと?と思われるでしょう。以下に簡単に説明いたします。1.トピックは母集団となる文書群から抽出される文書の成分として推定されるトピックは対象となる文書群から抽出されます。以下の二つのケースを考えてみます。スポーツ」などで、2の場合は「野球」「サッカー」「バスケット」「ラグビー」などでしょう。1よりも2の方がスポーツに関して偏った文書群であり、自然と単語の出現頻度もより具体的な単語が支配的になるためです。サッカー」など、明確に与えられるように書きました。実際はトピックも単語の成分として与えられます(OMG)。イメージとしては以下のようなものです。トピックは単語の成分で与えられるつまり処理手順はこういうイメージです文書群からトピック成分を抽出しトピックを定義するそのうえで個別の文書を分析にかけその文書のトピックの構成比率を明らかにする実践ということであとはコードでも書いていきましょう。前回ご紹介したPolyglotを利用してますので、まだご存じない方はこちら)をご覧ください。以下のコードは説明しやすいよう便宜的なデータセットで用意しています。実際はちゃんとDBを使ってデータの管理を行なっております。本筋に関連の薄い処理は割愛しております。名詞の抽出polyglot)を利用します。print(nouns)こんな名詞データが取れます。実際には名詞データを格納する際にクレンジングなどを行う必要があります。今回はサンプルとして2文字以下の名詞は含めない処理を書いてあります。先ほど抽出した名詞の配列から、単語と出願回数がペアになったデータを整備します。このタイミングで出現頻度の著しく高い単語や低い単語をフィルタリングしておきます。必要であれば辞書データを保存しておいてください。corpora.Dictionary.load_from_text('dict.txt')辞書の中はこのような形です。出現回数となっています。3.辞書と単語配列データからコーパスデータを作成ここでは単語とその出現回数をセットにしたデータ(BoW)のまとまりをコーパスと呼びます。print(c[0:5])出力内容はこちら。1)]先ほどの辞書のIDの単語が各ドキュメントで何回出現しているのかが見て取れます。4.トピックの抽出さて全体での単語の出現頻度や、個別文書での単語の出現頻度のデータが整備できました。これによって出現確率が計算できるようになります。コード上でもいよいよトピックの抽出を行います。トピックの数(これは恣意的に設定できる。t[1]))出力はこんな感じです。0.011415802285745767面白いですね。ところどころでnameやhttpなどのノイズがあるので、これは調整が必要そうです。ストップワード作ってフィルタしてしまうのもありだと思います。母集団である文書群を考え各トピックの意味を仮に以下のように定めます。最後に、文書を指定してその文書のトピックがどのようになっているか分析しましょう。対象となっている文書のコーパスデータをldaインスタンスに渡すだけです。topics_per_document[1]))こんな結果になります。この文書はビジネスの性質が強く出ている、というのがわかります。あとは閾値などを設けて実際にメタ情報として活用できます。0.17717648818921963終わりにいかがでしょうか?膨大な文書に対して全体像にフィットしたカテゴリ情報・メタ情報を付与したいときにはなかなか使えそうな方法ではないでしょうか。いざやってみると、データのクレンジング、ストップワード処理やステミングなど前処理の手間がそれなりにかかりますし、パラメータの調整もそれなりの難しさがあります。トピックの善し悪しの判断も必要です(トピックはできれば距離が離れているほうが望ましい)。いったことを踏まえると到底「お手軽」とは言えませんが一度試してみるのは良いかと思います。本日も最後までお読みいただきありがとうございました。例によって当社では一緒に開発してくれるメンバーを募集しております。カジュアル面談も随時行っておりますので、「ちょっと話聞きたい」という方は、このブログのサイドバー下にあるアドレスか@YojiShirakiあたりにDMいただければと思います。採用サイトもありますので↓↓↓のバナーから是非どうぞ!ちなみに次回はデザインの話に戻ります。22:16お手軽に英文文書にメタ情報を!!Pythonでgensimを使ったLDAに挑戦してみた。バグ修正状況を調べてみた。こちらのblogに登場いたします。データエンジニ...2019-07-19プロジェクトにBIツール「metabase」を導入したらいい感じになった話。機械学習を社内データに適用してみた山縣です。Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今をブログとTwitterで発信しています。@astamuseLabアスタミューゼで働きませんか?アスタミューゼでは現在エンジニア、デザイナーを募集中です。興味のある方はぜひご応募ください。(1)@astamuseLabさんのツイートastamuseサービスサイトastamuse世界中のinnovatorのために、創造活動を可視化し未来を創るためのプラットフォームです。活用や新規事業に役立つ様々な機能を提供します。ビッグデータ分析から情報提供し、あなたの知らない未来を発見するメディアです。reserved.スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。