R: text analysis, tidytext ver. 2

自然言語(日常言語、ふつうの言葉)は私のもっとも関心のあるところですが、直接の関心がなくても、検索や機械翻訳や感情分析や会話ロボットなど、言葉に関わる分析で用いられているので、基本的な仕組みをしっておくと、それぞれのプログラムがどのようなデータを処理しているのかがわかります。

例えば、感情分析の結果について、「そんなことまでわかるはずないやろう?」と思ったら、まず、どのように自然言語を処理しているかを確認することからはじめます。

 

次に、自然言語の分析のためのRの5つのライブラリが紹介されています。

 

The 5 Packages You Should Know for Text Analysis with R

 

5つの中で、可視化(visualization、グラフの作成)に強いと書かれいるtidytextを使ってみました。次に説明があります。

 

https://github.com/juliasilge/tidytext

 

I.ライブラリのインポートとデータの読み込み

 

library(janeaustenr) # 6 novels of Jane Austen
library(dplyr)
library(tidytext)
austen_books() 

 

austen_books()を実行すると次のようにJane Austenの6冊の本のデータが表示されます。

tibble(データフレームの一種)で表示されます。ライブラリtidytexにtibbleやtidyrやdplyrなどが含まれているようです。

73400行2列で、列名は、text(文字)とbook(ファクター)であるとことがわかります。

 

 

II.連番をふる

 

データにlineの列名で一列を加えて、各行に連番をふります。その際、わかりやすいように、本ごとに分けています。

 

# give consecutive numbers
original_books <- austen_books() %>% # 6冊の著作を
group_by(book) %>% # 本で分けて
mutate(line = row_number()) %>% # line行を加えて連番を配置
ungroup() # グループを解除
 

 

 

III.テキストをトークンに

 

言語分析のために、データを集計できる形、つまり、tokenにわけて、1行ごとにword 列に並べます。複雑なトークン化をtidytextが自動的に、しかも瞬時にやってくれます。

 

# restructure the data as one-token-per-row
tidy_books <- original_books %>% #データを
unnest_tokens(word, text) # tokenにして行に分けword列に配置
tidy_books
 

 

word列を見れると、すべて小文字になっているのがわかります。また、”&” や “(” や “)” などが削除されていることがわかります。ふつうは、大文字であっても小文字であっても同じ単語と考えますし、多くの記号は言語の分析と関係ありません。

ただし、どのような条件でトークン化するかは、オプションで選択できるはずです。

tokenで行を分けましたので、725055行になっています。この程度は、瞬時に集計します。

 

IV.ストップ・ワードを削除

 

不要な語を削除します。

 

# remove stop words
tidy_books <- tidy_books %>%
anti_join(get_stopwords())
tidy_books
 

 

デフォルトのstop wordsは次のような語です。

 

 

V.感情分析

 

“bing”辞書で、感情語を取り出してpositiveとnegativeの2段階で評価し、この差をsentiment列に算出します。

否定語を削除しているので、逆の感情評価になっている場合もありますが、全体としては、用いられている単語で評価できると考えられているようです。

また、評価する単位を80行としています。行数が多すぎても、少なすぎても文脈と無関係の評価になってしまいます。評価単位を何行にするのが適切かという一般理論はないと思いますが、より適切な単位を判定するアルゴリズムは可能かもしれません?

 

janeaustensentiment <- tidy_books %>% # データの
inner_join(get_sentiments("bing"), by = "word") %>% # 感情語を評価して
count(book, index = line %/% 80, sentiment) %>% # 80行ごとに集計して
spread(sentiment, n, fill = 0) %>% # negative列とpositive列で横長に
mutate(sentiment = positive - negative) # sentiment列に両者の差を算出
janeaustensentiment
 

 

 

本ごとにグラフにします。

 

library(ggplot2)
ggplot(janeaustensentiment, aes(index, sentiment, fill = book)) +
geom_bar(stat = "identity", show.legend = FALSE) +
facet_wrap(~book, ncol = 2, scales = "free_x")

 

本ごとのpositiveな感情語とnegativeな感情語の使用回数の増減が棒グラフになりました。

これを6冊の本の「明るい雰囲気」、あるいは、「暗い雰囲気」の分布を表現したものと解釈します。

 

not complete

Please follow and like us:
error

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.