この企画は、雑誌や教科書にでているグラフをSageで再現し、 グラフの意味を理解すると共にSageの使い方をマスターすることを目的としています。
今回は、集合知プログラミング の第3章にできてきます似たブログをグルーピイングした図3.3「ブログのクラスタのデンドログラム」 を取り上げます。
|
以前chasenを使って同じグラフの表示を行った python/集合知3章 では、chasenが英語の単語を扱えないため、トリッキーな処理を行いましたが、 MeCabではそのまま英語の単語が扱えるので、すっきりした形になります。
MeCabのインストール方法については、 MeCab を参照してください。
日本語のテキストから分かち書きの単語の内、partsに指定した形容詞、形容動詞、副詞、連体詞、名詞、動詞、未知語を 日本語の単語として抽出することにしました。また、minlenより小さな単語は取り除くようにしました。
pythonようのMeCabは、Taggerメソッドで生成し、parseメソッドで解析するというのが通常ですが、 ここでは単語の品詞と動詞の原形を使用したいので、parseToNodeメソッドでノードに分割した結果を 使って単語抽出を行いました。
|
まずは、簡単なテキストを入力して正しく単語が抽出できているか確認してみます。
splitの結果は、単語で区切られた文字列のリストを返すのですが、そのままだと \xnnの形式で表示されてしまうので、1単語ずつ表示してみました。
オリジナル ソース 原書 著者 Tobes ページ PCI Code zip する ダウンロード できる オリジナル ソース 原書 著者 Tobes ページ PCI Code zip する ダウンロード できる |
Sageはそのままではunicodeから文字列への変換でエラーが発生します。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)
これに対する対応としては、Sageのpythonのsite-packagesにsitecustomize.pyを以下のように 作成します。私の場合には、/usr/local/sage/local/lib/python/site-packages/に配置しました。
import sys sys.setdefaultencoding('utf-8')
配置が完了したら、sageを再起動してください。
splitができたので、htmlから単語のリストを返す getwordsはHTMLからタグをのぞいてsplitを呼び出すだけの処理となります。
|
フィードリストは、ワークシートのdataに含まれていますので、 ワークシートの上部のDataプルダウンからfeedlist.txtを選択して 編集することができます。
Sageのワークシートは実行可能なドキュメントですので、 自分の興味のあるブログリストをfeedlistにセットしてその結果を表示することが できます。
|
Sageのpythonのデフォルト言語がasciiであるため、そのままでは 日本語のテキストを処理しようとするとエラーになります。
getwords関数を呼び出している部分でstr関数を使ってunicodeを 文字列に変換しています。
|
PILライブラリは、そのままでは日本語を表示できませんが、 ImageFontに日本語のTrueタイプフォントを指定することで 文字化けなしに表示できるようになります。
また、日本語を表示する部分では、unicodeに変換してからtextメソッド に渡す必要があります。
utxt = unicode(labels[clust.id],'utf-8') draw.text((x+5,y-7),utxt,(0,0,0),font=font)
|
集合知3章の例題の通り、feedlist.txtに指定されたブログから 単語を抽出してみます。
|
wordlistにはすべてのブログに出現した単語のリストが入っているため、 各ブログの単語の出現頻度を計算する場合、ブログに指定単語が含まれる かをチェックする必要があります。_word関数を以下のように定義して クラスタ分析に渡す、出現頻度マトリックスの作成します。
|
|
単語の出現頻度マトリックスdataをhcluster関数に渡してブログのクラスタ分析をします。
その結果をdrawdegrogram関数に渡してデンドログラムを表示します(blogclust.pngにも保存します)。
アメブロの芸能人のブログが固まっていたり、ちょっとお固そうなブログが集まっていたりとそれらしい分類が されているのが見て取れます。
|
|
|