前回は、「クラスター分析」で必要となる「素性ベクトル(特徴ベクトル)」の作り方をまとめました。
第3回『テキストマイニングなどのクラスター分析でも重要な「素性ベクトル」を作るための3つのステップとは?』
(それ以外の過去記事は、下にございます)
今回は、素性ベクトルをつくるときの「必須テクニック」についてです。
素性ベクトルは、各文書の特徴となる単語の「出現頻度」をベクトル形式で保存したものでした。
出現頻度を数えるには、まず文書を単語に分割しました。
前回の例をもう一度挙げると、
(文書1)、自然言語処理 / は /、 /人間 / が / 日常的に / 使っている / 自然言語 / を / コンピュータ / に / 処理させる / 一連 / の / 技術 / であり / 、 / 人工知能 / と / 言語学 / の / 一分野 / である / 。/
(文書2)、人工知能 / とは / 、 / 人工的 / に / コンピュータ / 上 / など / で / 人間 / と / 同様 / の / 知能 / を / 実現させよう / という / 試み / 、 / 或は / そのため / の / 一連 / の / 基礎技術 / を / 指す / 。 /
のように分割できました。
分割した単語ごとに、それぞれ何回出現しているか数え上げるわけです。
単語には、微妙に違う変化形がある
単語を数え上げる時に考えてほしいのですが、
例えば文書1の ”コンピュータ” という単語ですが、
(今回はありませんでしたが)もし文書中に、”コンピューター” という単語があったときに、
今までのやり方だと、これらは別々の単語として数えられます。
でもよく考えると、これらは同じ語幹で同じ意味ですよね。
なので、文書の特徴を表すには、どれか1つで十分と考えられます。
また、文書が膨大になったときには、素性ベクトルも膨大になりますので、データはできるだけ減らした方がいいわけです。
そういうわけで、
「同じ語幹を持つ単語は1つとして考える」
という工夫が有効だとわかっていただけるかと思います。
同じ語幹をもつ単語が少しずつ変化してたくさんの単語に派生していることを「表記ゆれ」といったりします。
単語を数え上げる前に、表記ゆれの対策をして数える単語を減らす、というステップが加わってきます。
つまり、工夫の1つ目は、「表記ゆれ対策」となります。
また、この表記ゆれの対策をするためのアルゴリズムを「ステミング」と呼びます。
ステムは(語幹)の意味で、各単語を語幹に変換してしまおうというのがステミングです。
語幹にした上で出現頻度を数えればいいですよね、というわけです。
ちなみに、表記ゆれの対策は奥が深いんです。
たとえば ”バイオリン” と ”ヴァイオリン” という単語がありますが、これらを含む文書をクラスタリングすることを考えます。
一般的な文書集合であれば、これらは同じものとしてまとめても問題ないのではないでしょうか。
しかし、バイオリンの専門文書を扱う場合には、もしかしたら同一視してはいけないかもしれません。
(実際にそうかはわからないですが)専門家の中ではこれらの単語の使い方には違いがあり、
それが文書の特徴になるかもしれないからです。
そういう場合にはこれらの単語は違うものとして扱った方がいいクラスタリングができるかもしれません。
つまり、考える文書集合に応じて、考えるべき表記ゆれも変わる?ということを言いたかったんです。
表記ゆれが奥深いことがわかっていただけるかと思います。
ステミングに話を戻しますが、
ステミングのアルゴリズムは、1979年に初めて開発され、開発者がMartin F Porterだったので、
そのアルゴリズムは、
- 「Porterステミング」
- 「Porterステミングアルゴリズム」
などと呼ばれたりしています。
ステミングアルゴリズムについて詳しく知りたい方は、こちらをどうぞ
An algorithm for suffix stripping, Martin F Porter (論文のPDFです)
他のステミングアルゴリズムも開発されていて、
例えば、
- 「Snowballステマー」
- 「Lancasterステマー」
などがあります。
SnowballステマーはPorterステマー2とも呼ばれていて、LancasterステマーはPorterステマーよりも高速であるメリットがあります。
これらを手軽に使ってみたい方は、
Pythonライブラリである
NLTK(Natural Language Toolkit for Python)
に実装されてますので、
そちらのマニュアル等を参考にされるのもいいかと思います。
また、NLTKの使い方はこちらの本にも詳しく解説があります
こちらはPythonの自然言語処理の入門書です↓
というわけで、今回は素性ベクトルを作る際の工夫の1つめとして、
「表記ゆれ・ステミング」についてでした。
次回は、素性ベクトルを作る際の工夫の2つめをご紹介します↓
第5回『テキストマイニングなどの「クラスター分析」で必要な「素性ベクトル」を洗練する2つのテクニックとは?』
過去記事はこちらです↓
第3回『テキストマイニングなどのクラスター分析でも重要な「素性ベクトル」を作るための3つのステップとは?』
第2回『テキストマイニングの「クラスター分析」でも必要な「素性ベクトル」とは?なぜ必要なの?』
第1回『「クラスター分析」とは?膨大な情報の内容を、ラク〜にサクッと理解したいあなたはこちらをどうぞ』
本連載では、クラスター分析に関する記事を定期的に更新しています。
Twitterなどフォローしてもらえると、更新情報が届くので便利です!
こちらもございます↓
こちらの記事もございます
『「機械学習」に入門したいあなたにチェックしてほしい良書、10冊はこちらです』
『「データマイニング」を勉強したいあなたにチェックしてほしい良書、10冊はこちらです』
『「エクセル」で「データ分析」できるようになりたいあなたにチェックしてほしい良書10冊はこちらです』
『「データ分析」を活用したい!けど分からないことだらけの方、その悩みを解決する良書10冊はこちらです』
『「アンケート調査」をしたいあなたにチェックしてほしい良書、8冊はこちらです』
↓こちら無料で読めます
(Kindle Unlimited にご登録ください)