読者です 読者をやめる 読者になる 読者になる

n-gramを集計する

 今回は、n-gramの集計を行ってみたいと思います。分析データは、James JoyceA Portrait of the Artist as a Young Manとします。
 まず、Project Guterbergで公開されているデータを直接読み込みます。*1

# 分析データの読み込み
# 読み込む際に、全ての文字を小文字に変換
corpus <- tolower(scan("http://www.gutenberg.org/cache/epub/4217/pg4217.txt", what = "char", sep = "\n", quiet = TRUE))

 次に、読み込んだテクストを単語のベクトルに変換し、スペースを取り除きます。

# 単語ベクトルに変換
word.vector <- unlist(strsplit(corpus, "([^-a-z0-9]+|--)"))
# スペースを削除
not.blank <- which(word.vector != "")
word.vector2 <- word.vector[not.blank]

 では、単語の2-gramを集計してみましょう。

# 2-gramの抽出
x <- length(word.vector2) - 1
results <- vector()
for (i in 1 : x) {
	ngram <- paste(word.vector2[i], word.vector2[i + 1])
	results <- append(results, ngram)
}
# 頻度集計
ngram.freq <- table(results)
sorted.ngram.freq <- sort(ngram.freq, decreasing = TRUE)
sorted.table <- paste(names(sorted.ngram.freq), sorted.ngram.freq, sep = ": ")
# 頻度上位20位までを表示
head(sorted.table, 20)

 上記のスクリプトを実行すると、頻度上位20位までの2-gramが出力されます。

 [1] "of the: 927"   "in the: 513"   "he had: 285"   "to the: 252"  
 [5] "on the: 242"   "of his: 234"   "and the: 214"  "at the: 189"  
 [9] "it was: 179"   "from the: 169" "he was: 163"   "in a: 139"    
[13] "of a: 138"     "by the: 124"   "and he: 111"   "to be: 111"   
[17] "in his: 106"   "out of: 105"   "with the: 105" "was a: 101"

 また、スクリプトを少し修正すれば、3-gramなどを集計することもできます。

# 3-gramの抽出
x <- length(word.vector2) - 2
results <- vector()
for (i in 1 : x) {
	ngram <- paste(word.vector2[i], word.vector2[i + 1], word.vector[i + 2])
	results <- append(results, ngram)
}
# 頻度集計
ngram.freq <- table(results)
sorted.ngram.freq <- sort(ngram.freq, decreasing = TRUE)
sorted.table <- paste(names(sorted.ngram.freq), sorted.ngram.freq, sep = ": ")
# 頻度上位20位までを表示
head(sorted.table, 20)

 上記のスクリプトを実行すると、頻度上位20位までの3-gramが出力されます。

 [1] "out of the: 42"         "his father s: 31"      
 [3] "said mr dedalus: 31"    "the prefect of: 29"    
 [5] "prefect of studies: 26" "do you know: 25"       
 [7] "the end of: 25"         "he had been: 24"       
 [9] "which he had: 24"       "one of the: 23"        
[11] "at the end: 22"         "it was a: 22"          
[13] "that it was: 22"        "of his own: 21"        
[15] "he could not: 20"       "it was the: 20"        
[17] "that he had: 20"        "when he had: 20"       
[19] "and of the: 19"         "i don t: 19"

*1:本来であれば、分析を始める前にテクストの本文以外の部分を削除する必要がありますが、ここでは省略します。

広告を非表示にする