単語の基本形と品詞の情報を利用したワードリストを作る

 R Advent Calendar 2016の12日目の記事です。以前、ワードリストを作るという記事を書きましたが、R単体では、英単語の基本形や品詞の情報を利用したワードリストを作ることができません。基本形や品詞の情報を使うには、品詞タガーによる前処理が必要となります。品詞タガーにもいろいろなものが存在しますが、今回は、TreeTaggerを使用します。*1 このタガーは、英語以外の様々な言語にも対応しています。インストール方法や使い方については、公式ウェブサイトを参照してください。*2
 TreeTaggerで解析したテキストファイルは、(主に)タブ区切りのテキストファイルで出力されます。以下の例は、Hillary Clintonのconcession speechをTreeTaggerで解析した結果をRに読み込んだものです。

# TreeTaggerで解析済みのデータの読み込みと確認
tagged.text <- read.delim(file.choose(), header = FALSE)
head(tagged.text)

 上記のスクリプトを実行すると、以下のような結果が得られます。左の列が単語の表層形、中央の列が品詞の情報、右の列が基本形の情報です。また、JJやNNといった記号が何を意味するかは、こちらのタグリストなどを参照してください。

             V1  V2           V3
1          Last  JJ         last
2         night  NN        night
3             ,   ,            ,
4             I  PP            I
5 congratulated VVD congratulate
6        Donald  NP       Donald

 まずは、一番右の列にある基本形の情報を使って、ワードリストを作成します。

# 基本形の情報だけを抽出
lemmatized.words <- tagged.text[, 3]
# 全ての文字を小文字に変換
lemmatized.words.lower <- tolower(lemmatized.words)
# スペースの削除
not.blank <- which(lemmatized.words.lower != "")
lemmatized.words.cleaned <- lemmatized.words.lower[not.blank]
# 頻度集計
freq.list <- table(lemmatized.words.cleaned)
freq.list.sorted <- sort(freq.list, decreasing = TRUE)
word.list <- paste(names(freq.list.sorted), freq.list.sorted, sep = ": ")
# 集計結果(上位10語)の確認
head(word.list, 10)

 上記のスクリプトを実行すると、以下のような結果が得られます。今回は、記号や数字を集計対象に含めていますが、もし削除したい場合は、tmパッケージのremoveNumbers関数とremovePunctuation関数を使うことができます。*3

 [1] ",: 63"   "and: 57" ".: 43"   "be: 37"  "the: 30"
 [6] "we: 27"  "for: 26" "i: 26"   "to: 26"  "of: 24" 

 次に、品詞の情報を利用したワードリストを作成します。品詞の情報を使うことで、たとえば、助動詞のwillと名詞のwillのような単語を別々に集計することが可能になります。

# 単語と品詞の情報を抽出して結合
words.and.POS <- paste(tagged.text[, 1], tagged.text[, 2], sep = "_")
# 全ての文字を小文字に変換
words.and.POS.lower <- tolower(words.and.POS)
# 頻度集計
freq.list.POS <- table(words.and.POS.lower)
freq.list.POS.sorted <- sort(freq.list.POS, decreasing = TRUE)
word.list.POS <- paste(names(freq.list.POS.sorted), freq.list.POS.sorted, sep = ": ")
# 集計結果(上位10語)の確認
head(word.list.POS, 10)

 上記のスクリプトを実行すると、以下のような結果が得られます。

 [1] ",_,: 63"     "and_cc: 57"  "._sent: 43"  "the_dt: 30"  "we_pp: 27"  
 [6] "for_in: 26"  "i_pp: 26"    "to_to: 26"   "of_in: 24"   "our_pp$: 24"

 なお、Rによる英文テキスト処理については、以下のような参考文献もあります。*4

Quantitative Corpus Linguistics with R: A Practical Introduction

Quantitative Corpus Linguistics with R: A Practical Introduction

Text Analysis with R for Students of Literature (Quantitative Methods in the Humanities and Social Sciences)

Text Analysis with R for Students of Literature (Quantitative Methods in the Humanities and Social Sciences)

 Enjoy!!

*1:その他の品詞タガーについては、Wikipediaの記事などを参照してください。因みに、日本語の場合は、RMeCabパッケージを利用することが可能です。

*2:もう少し手軽にTreeTaggerを使ってみたい場合は、TagAntというGUIツール、あるいはオンライン版もあります。また、RからTreeTaggerを直接操作する方法については、こちらの記事などが参考になります。

*3:詳しくは、こちらを参照してください。

*4:日本語と英語のテキスト処理については、まもなく出版される拙著でも扱っています(ぼそ)。