Apitore blog

Apitoreを運営していた元起業家のブログ

【API】Word2Vecで入力文章の要約単語を抜き出す

はじめに

先日のTFIDFを使った文章タグ計算のAPIに続いて、今度はword2vecを使って文章の要約単語を抜き出しました。TFIDFだと意味的に類似した単語の区別がつかないのですが、word2vecであれば意味的に類似した単語がコサイン距離で分かるので、出力の文章タグがそれぞれ独立した単語になります。 amarec (20161225-071022)

API

サンプルコード

使ってみた

まずアルゴリズムについて説明します。タグはN個生成するとします。入力文をkuromoji APIで形態素解析し、名詞、動詞、形容詞、未知語のみを代表語の候補とします。また、いくつかストップ品詞細分類とストップワードも設定しています。続いて、TFIDFを算出し、上位M語を抜き出します。TFIDFの算出方法についてはTEXT2LABEL by tfidfを参照下さい。このM語をWord2Vec APIでWord vectorにします。そして、KmeansでN個のクラスタに分類します。このN個のクラスタの中心ベクトルに最も近い単語を、文章の代表語として出力します。 実際に使ってみましょう。せっかくなので、TEXT2LABEL by tfidfの記事で使ったミーアキャットのwikipedia文章を入力してみます。scoreはTFIDF値です。

"input": "石や岩の多い荒地やサバンナに生息する[2]。昼行性[1]。地中に直径10センチメートルの巣穴を掘って生活する[2]。ペアもしくは家族群で生活し、複数の家族群が一緒に生活することもある[2]。 食性は雑食で、昆虫、クモ、サソリ、多足類、爬虫類、鳥類、小型哺乳類、植物の茎、芽、根、果実などを食べる[2]。 繁殖形態は胎生。10-翌4月に交尾を行い、妊娠期間は11週間[2]。1回に2-5頭の幼獣を産む[2]。授乳期間は4-6週間。幼獣は生後12-14日で開眼し、生後10週間で独立する[2]。生後9か月で性成熟する[2]。",
"num": "10",
"labels": [
  {
    "label": "一緒に",
    "score": 1.8090739134074127
  },
  {
    "label": "巣",
    "score": 2.3926596963958855
  },
  {
    "label": "独立",
    "score": 1.3304835850437124
  },
  {
    "label": "哺乳類",
    "score": 2.5247793680976027
  },
  {
    "label": "複数",
    "score": 1.2623259279008794
  },
  {
    "label": "開眼",
    "score": 3.0751296102629357
  },
  {
    "label": "茎",
    "score": 2.5112286197503644
  },
  {
    "label": "9か月",
    "score": 2.997478469668541
  },
  {
    "label": "昼行性",
    "score": 3.4902047977187793
  },
  {
    "label": "雑食",
    "score": 2.930896786811767
  }
]

ちょっと見やすく整理すると、 TFIDFを使った結果:「生後」「幼」「生活」「昼行性」「胎生」「授乳」「サソリ」「荒野」「開眼」「掘る」 Word2Vecを使った結果:「昼行性」「開眼」「9か月」「雑食」「哺乳類」「茎」「巣」「一緒に」「独立」「複数」 見事に全然違いますね。どっちが良いかというと難しいですが、それぞれの手法でミーアキャットの生態について特徴を捉えています。

おわりに

Word2Vecを利用して入力文章から意味的に類似しない代表語を取得しました。以前やった、Word2Vecを使って文書タグを生成してみた(失敗例)、と比べてそれっぽい単語が代表語に選ばれるようになっています。こちらのAPIもTFIDFのときと同様にURL2TEXTバージョンも公開します。