この記事はRでtwitterの検索結果から同表記異義語をフィルタする その2 Wikipediaの記事抽出のつづきです。
対象となる文書が集められたら、あとは集計するのみ。
各クラスを特徴づける語彙のスコアを算出する
RMeCabパッケージの docMatrix
関数を使用した。想像以上に簡単。
tf_idf <- docMatrix(WIKIPEDIA_CONTENT_DIR, weight="tf*idf")
データフレームから関心のない列を取り除く
Rの intersect(arg1, arg2)
関数を使い、arg1
とarg2
双方に存在する文字列を名前にもつ列だけを取り出す。
tf_idf <- tf_idf[,intersect(colnames(tf_idf),kTargetClasses)]
データフレームにおいて特定の行名を持つ列のデータを操作する
tf_idf[Term=target_word,] <- (tf_idf[Term=target_word,] * 0)
結果
そのクラスに所属する確度(全クラスのスコアの合計で正規化した値)に対しヒューリスティックに設定した値(0.27)でフィルタリングした結果。検索結果に含まれるツイートを一つ一つ人手で分類するよりかは生産性が高そう。
GitHubで公開したRStudio Projectファイルについて
今回作成したRファイルをGitHubで公開しました。
twitter-word-sense-disambiguation-w-tf-idf-of-wikipedia
constants.R
ファイルを編集すると、お好きなキーワードで試すことができます。使い方についてはREADME.md
ファイルとこの連載記事(初回)を参考にしてください。
課題
- Wikipediaに記事がない地味に有名な固有名詞は識別することができない。
- 抽出したい意味が、他の同表記語と比べて明らかに違う分類(例:抽出対象は地名で、他の同表記語は人名など)である場合、格フレームを活用した分類も有効に働くのではないか。
備忘
- Rのapply関数便利。cbind等でテーブルを作ろうとすると、matrixができあがる。matrixだと複数のデータタイプを持たせるのに向いてない(numericだったmatrixに文字列から構成されるmatrixをcbindすると、numericだったデータがfactor型になって不等号を使用したフィルタリングができなくなる)
- 1行のみのデータに対しapplyを掛けたいときはlapply関数(list-apply?)を使用する。applyを使おうとすると次元数が足りないというエラーが出力されて止まる。