:2019-03-15最終更新:2019-03-15クロス元の投稿をみる(https://qiita.com/pai...)概要Document-Term-Matrixをレーティングデータに見立てることで協調フィルタリングを適用し、「似たような文書では他にどのような単語が使われているか」にもとづいて、特定の単語が(実際には使われていないが)使われていてもおかしくなさそうな文書を探したら面白そうだと思った。基本的なアイデアMovieLensのようなデータセットにおいて、同じようなカラムについて同じようなレーティングをしているユーザーは、同じようなものごとを同じような重さで扱っているといえる。ユーザーAとユーザーBのどちらもがコメディがめっちゃ好きだった場合、ユーザーAとユーザーBは、実際にレーティングしている作品に違いがあったとしても「コメディがめっちゃ好き」という意味において「同じ意味をもっている」といえそうだ。NAMovieLensのようなデータセットとDocument-Term-Matrix(DTM)が同じ構造をしていると見なすと、DTMではユーザーは文書に相当し、各カラムは単語に相当する。同じような単語が同じような頻度で出現する文書は、やはり同じようなものごとを同じような重さで扱っているといえる。文書Aと文書Bのどちらにも「恋」とか「君」とか「2人」といった単語が出現していれば、どちらも「2人の恋について話題にしている」という意味において「同じ意味をもっている」といえるだろう。このように考えると、協調フィルタリングは任意のケースと「同じ意味をもっている」ケースを探索して「同じ意味をもっているならこのケースはこのものごとにも関心があるだろう」みたいなことを予測していると理解できる。「恋ということばを使わずに恋を文学的に表現する」みたいな、そうとは言ってないけどそういうこと表現しているよねみたいな文書を探索できるんじゃね?というのが基本的なアイデア。やったこと秋元康が作詞している歌詞を題材に、「恋」「好き」「大好き」という単語が(実際には使われていないが)使われていそうな歌詞を抽出する。歌詞は歌ネットからスクレイピングして保存しておいた。POSは品詞のリスト。ここでは名詞のみを指定している。)これをイイ感じに加工して以下のようなかたちにする。辞書がアレで名詞じゃなさそうなのも混じっているが、このままでいく。rows協調フィルタリング{recommenderlab}のユーザベースの協調フィルタリングを適用する。has_NGは「恋」「好き」「大好き」の3語が出現する歌詞のリスト。select(恋,好き,大好き)期待される結果{arules}でアソシエーション分析しておく。arrange(desc(恋))affinityはここでは共起のしやすさみたいなもので、値が大きいほど共起しやすいといえる。「恋」という表現については、こういう単語が含まれている歌詞をあげられることが期待されるということ。rows相関ルールも確認しておく。inspectDT(rules)「友だち」「ハート」「気持ち」「好き」といった単語が含まれていると、とくに恋っぽいことが多いらしい。「恋」「好き」「大好き」という単語がとにかくいっぱい使われていそうな歌詞をとってみる。write_csv("cache/top.csv")こうなった。時の河に埋もれて愛は殻の中誰でも評価トピックモデルここまでやって気づいたのだが、秋元康がどんな歌詞を書いているのかきちんと把握していないので、実は適当に予測してもけっこう恋っぽい歌詞にあたってしまうのではないかという疑惑が生じた。上の結果ではそんなに恋っぽい歌詞が抽出できなかったけれど、それが偶然なのかもよくわからない。そのへん含め、もうすこし検討するために{topicmodels}でトピック分析してみる。くれればいいのでトピック数は適当に決めた。write_csv("cache/topic_term.csv")それぞれのトピックに特徴的な単語。