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

共起語を集計する

 今回は、共起語(コロケーション)の集計をしてみたいと思います。*1 共起語の集計は、ワードリストの作成やKWIC形式の用例表示と並んで、コーパス言語学における基本的な技術とされています。
 今回の分析データは、Jonathan SwiftA Modest Proposalとします。まずは、Project Guterbergで公開されているデータを直接読み込みます。*2

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

 次に、(1) 検索語、(2) スパン、(3) 出力ファイル、の3つを指定します。*3

# 検索語の指定
# 以下の例では、"children"
search.word <- "\\bchildren\\b"
# スパンの指定
# 以下の例では、前後3語まで
span <- 3
span <- (-span : span)
# 出力ファイルの指定
output.file <- "output.txt"

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

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

 以上の準備が終わったら、共起語の集計を行います。

# 検索語の出現する位置を特定
positions.of.matches <- grep(search.word, word.vector, perl = TRUE)
# 共起語の集計
results <- list()
for(i in 1 : length(span)) { 
	collocate.positions <- positions.of.matches + span[i]
	collocates <- word.vector[collocate.positions]
	sorted.collocates <- sort(table(collocates), decreasing = TRUE)
	results[[i]] <- sorted.collocates
}
# 集計表のヘッダーを出力
cat(paste(rep(c("W_", "F_"), length(span)), rep(span, each = 2), sep = ""), "\n", sep = "\t", file = output.file)
# 集計データを出力
lengths <- sapply(results, length)
for(k in 1 : max(lengths)) {
	output.string <- paste(names(sapply(results, "[", k)), sapply(results, "[", k), sep = "\t")
	output.string.2 <- gsub("NA\tNA", "\t", output.string, perl = TRUE)
	cat(output.string.2, "\n", sep = "\t", file = output.file, append = TRUE)
}

 上記のスクリプトを実行すると、先ほど指定したファイルの中に集計表が出力されます。検索語 (children) から見て、左3語 (-3) から右3語 (3) の位置までに出現する共起語 (W) とその頻度 (F) が一目瞭然です。*4

W_-3	F_-3	W_-2	F_-2	W_-1	F_-1	W_0	F_0	W_1	F_1	W_2	F_2	W_3	F_3	
and	2	or	2	the	5	children	20	of	4	poor	3	beggars	2	
for	2	preventing	2	thousand	3			alas	1	and	2	people	2	
an	1	their	2	their	2			alive	1	in	2	accident	1	
four	1	twenty	2	these	2			all	1	are	1	apprehend	1	
i	1	are	1	and	1			already	1	be	1	arms	1	
is	1	buying	1	bastard	1			although	1	by	1	dressing	1	
maintain	1	for	1	more	1			are	1	computed	1	flesh	1	
miscarry	1	have	1	no	1			born	1	i	1	frequent	1	
mothers	1	hundred	1	of	1			by	1	professed	1	i	1	
murdering	1	making	1	own	1			die	1	s	1	parents	1	
of	1	number	1	six	1			from	1	seldom	1	rags	1	
only	1	of	1	whose	1			in	1	the	1	rid	1	
prodigious	1	that	1					infant	1	they	1	roman	1	
recommend	1	to	1					sound	1	too	1	the	1	
sale	1	towards	1					when	1	two	1	twenty	1	
their	1	wives	1					who	1	which	1	useful	1	
there	1							will	1			were	1	
title	1											years	1	

*1:今回のスクリプトは、Gries (2009) に基づいています。

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

*3:出力ファイルは、ワーキング・ディレクトリに置いておきましょう。

*4:検索語は、0の位置に表示されています。

広告を非表示にする