Apitore blog

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

【API】単語郡を意味的な近さでクラスタリングする(Word2Vec利用)

はじめに

Apitoreユーザーからのリクエストにお応えして、Word2Vecを使った単語クラスタリングAPIを実装しました。単語郡を入力すると各単語のWord2Vec APIの結果にKmeansクラスタリングを適用して意味的に近いクラスタを任意の数だけ作ります。Word2Vecの元が日本語WikipediaになっているのでWiki基準の意味クラスタではありますが、使い方次第で面白いかも?

API

サンプルコード

解説

アルゴリズムについて一言で解説すると、 単語郡→Word2Vecでベクトル郡→KmeansクラスタリングでN個のクラスタに分類 となります。Kmeansクラスタリングは任意の数(N)の集合に分ける一番有名な手法です。細かいアルゴリズムはググれば腐るほど出てきますので省略します。初期値は乱数を使います。プロダクション用途では、通常乱数はシードを固定しますが、今回はdeeplearning4jに内包されているKmeansを使ったために乱数シードを固定できませんでした。なので、実行するたびにクラスタリングの実行結果が変わります。お気に入りのクラスタリングが出来たときは、ちゃんと手元に保存しておいて下さい。

使ってみる

APIをとりあえず試す流れはこちらにチュートリアルを作ったので確認してください。ここからは実例を見てみます。 wikiから適当に文を拾ってきて、形態素解析かけて全部投げてみます。本来であれば内容語だけに絞ってやった方が良いと思います。もしくは名詞だけとか。今回はめんどくさいので全部なげます。入力文は以下です。

ノストラダムスは改宗ユダヤ人を先祖とし、1503年にプロヴァンスで生まれ、おそらくアヴィニョン大学で教養科目を、モンペリエ大学では医学を、それぞれ学んだ。南仏でのペスト流行時には積極的に治療にあたり、後年にその時の経験などを踏まえて『化粧品とジャム論』などを著した。
他方で、1550年頃から占星術師としての執筆活動も始め、代表作『ミシェル・ノストラダムス師の予言集』などを著し、当時大いにもてはやされた。王妃カトリーヌ・ド・メディシスら王族や有力者たちの中にも彼の予言を賛嘆する者が現れ、1564年には、国王シャルル9世より「常任侍医兼顧問」に任命された。その2年後、病気により62歳で没した。
彼の作品で特によく知られているのが、『ミシェル・ノストラダムス師の予言集』である(『諸世紀』という名称も流布しているが、適切なものではない)。そこに収められた四行詩形式の予言は非常に難解であったため、後世様々に解釈され、その「的中例」が広く喧伝されてきた。あわせてノストラダムス自身の生涯にも多くの伝説が積み重ねられてゆき、結果として、信奉者たちにより「大予言者ノストラダムス」として祭り上げられることとなった(「ノストラダムス現象」も参照のこと)。
長らくこれに対する学術的検証はほとんど行われてこなかったが、現在では伝説を極力排除した彼の生涯や、彼自身の予言観や未来観を形成する上で強い影響を与えたと考えられる文典の存在なども、徐々に明らかとなりつつある。そうした知見を踏まえる形で、ルネサンス期の一人の人文主義者としてのノストラダムス像の形成や、彼の作品への文学的再評価などが、目下着実に行われつつある。

クラスタ数は5でやってみます。Responseにはクラスタ毎の中央ベクトルとクラスタに所属する単語郡が返ってきますが、今回は部分的に抜粋します。

"words": ["そうした","特に","他方","多く","積極的",...]
"words": ["一","四","中","2","人",...]
"words": ["が","に","も","は","で",...]
"words": ["彼","賛嘆","後世","信奉","喧伝",...]
"words": ["化粧品とジャム論","諸世紀","人文主義者","シャルル9世","モンペリエ大学",...]

なんとなく理解できるクラスタがあります。3つ目のクラスタは助詞っぽいです。2つ目のクラスタは数字に関係がありそうです。5つ目のクラスタは「ノストラダムス」に関係ありそうな内容語っぽいです。なんとなくですが、2つ目と3つ目のクラスタは捨てても良さそうですね。 5分類だと荒すぎるので、20分類くらいにしてみます。するとさっきよりもクラスタリングの効果が見えてきます。

"words": ["だ","たち","き","ら","な",...]
"words": ["顧問","主任","兼","任命","代表",...]
"words": ["一","四","2","行"]
"words": ["シャルル9世","カトリーヌ・ド・メディシス","王妃","国王","アヴィニョン",...]
"words": ["多く","特に","ほとんど","や","その",...]
"words": ["そうした","後世","賛嘆","喧伝","考え",...]
"words": ["式","形","62"]
"words": ["化粧品とジャム論","諸世紀","ノストラダムス現象","ミシェル・ノストラダムス師の予言集","ノストラダムス",...]
"words": ["が","に","も","は","で",...]
"words": ["頃","当時","時","後","始め",...]
"words": ["先祖","没し","王族","生まれ","病気",...]
"words": ["より","から","あわせ","ゆき","参照",...]
"words": ["者","人"]
"words": ["大学","医学","モンペリエ大学","学術","教養",...]
"words": ["詩形"]
"words": ["こと","これ","他方","ため","もの",...]
"words": ["「","」","『","』","(",...]
"words": ["人文主義者","改宗","ルネサンス","信奉","占星術",...]
"words": ["未","再"]
"words": ["中","上","目下","形成"]

おわりに

今回は単語クラスタリングのAPIを作成し公開しました。結果を見てもらえば分かる通り、なんとなく単語の意味が近いものが同じクラスタに分類されています。 応用としては、例えば簡易的な技術文書の分類が挙げられます。

  1. 適当な量の技術文書郡を形態素解析して単語集合を作る。
  2. 単語クラスタリングのAPIで30クラスタくらいに分類する。
  3. 上記結果のクラスタを文書分類のタグとする。任意の文書内の単語のうち、任意のクラスタの単語を多く含む場合は、当該クラスタに所属するとする。

上記アルゴリズムはあくまで一例です。世の中にはもっとスマートなアルゴリズム(例 LDA)がたくさんあります。ただし、上記アルゴリズムでもうまく人間の知恵とあわせれば、それなりに使えると思います。機械学習を使わなくても、精度を求めないような簡単なタスクであれば、ルールベースでも全然使えます。 他にも色々とできることはあると思うので、是非お試しください。