言葉の向こう側:トークン化(2)
tidytext パッケージを使うと、dplyr や sparklyr などの「tidyverse」パッケージを活用してテキストデータを分析できます。センチメント分析(感情分析)の詳細はこのコースの範囲外ですが、Sentiment Analysis コースで詳しく学べます。この演習では、Spark 上でセンチメント分析を行う方法を簡単に体験しましょう。
センチメント分析とは、各単語にスコアや感情を割り当てる手法です。たとえば AFINN レキシコンでは、"outstanding" はほぼ常に肯定的な文脈で使われるため、スコアは +5 です。"grace" はやや肯定的な単語でスコアは +1、"fraud" は否定的な文脈で使われることが多くスコアは -4 です。AFINN スコアのデータセットは get_sentiments("afinn") で取得できます。なお、トークン化済みの単語データとセンチメントレキシコンは、あらかじめ Spark にコピーされています。
通常、複数のデータグループのセンチメントを比較したい場合は、次のようなコードパターンを使います。
text_data %>%
inner_join(sentiments, by = "word") %>%
group_by(some_group) %>%
summarize(positivity = sum(score))
内部結合(inner join)は、最初のテーブルのすべての値を対象に、2番目のテーブルで一致するものを探します。一致が見つかった場合、2番目のテーブルのデータが追加されます。左結合(left join)と異なり、一致しない行は除外されます。この仕組みを以下の図で確認しましょう。

左結合と同様、内部結合も最初のテーブルに列を追加する「変換結合」の一種です。内部結合にどの関数を使うか、また使い方を考えてみましょう。(ヒント:left_join()、anti_join()、semi_join() と非常によく似た使い方です!)
この演習はコースの一部です
sparklyr を使った Spark 入門(R)
演習の手順
Spark への接続は spark_conn としてあらかじめ作成されています。Spark に格納されたタイトル単語データとセンチメントレキシコンに紐付けられた tibble は、それぞれ title_text_tbl と afinn_sentiments_tbl として定義済みです。
title_text_tblからsentimental_artistsという変数を作成します。inner_join()を使って、"word"をキーにafinn_sentiments_tblをtitle_text_tblに結合します。artist_nameでグループ化します。scoreフィールドの合計を表す変数positivityを定義するよう要約します。
- 曲名のセンチメントが最も低いアーティスト上位5組を見つけます。
sentimental_artistsをpositivityの昇順に並べ替えます。slice_maxを使って上位5件を取得します。
- 曲名のセンチメントが最も高いアーティスト上位5組を見つけます。
sentimental_artistsをpositivityの降順に並べ替えます。- 上位5件を取得します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# title_text_tbl, afinn_sentiments_tbl have been pre-defined
title_text_tbl
afinn_sentiments_tbl
sentimental_artists <- title_text_tbl %>%
# Inner join with sentiments on word field
___ %>%
# Group by artist
___ %>%
# Summarize to get positivity
___
sentimental_artists %>%
# Arrange by ascending positivity
___ %>%
# Get top 5
___
sentimental_artists %>%
# Arrange by descending positivity
___ %>%
# Get top 5
___