1 復習 Review

1.1 ファイルの読み込み

1.1.1 準備:今どこにいるか?

  • メニュー「Session」> Set Working Directory > Choose Directory で目的のフォルダを開く
  • Knit ▼> Knit Diretory > Current Working Directory

1.1.2 場所の確認:getwd()

getwd()

[1] “C:/(中略)/NICER1_3_2/2020-11-24NICER1_3_2/NICER_NNS”

1.1.3 二つのサブディレクトリーを使う場合、その上のディレクトリーをWorking Directoryにする

  • 使う方を事前に setwd() で指定
[1] "C:/(中略)/NICER1_3_2/2020-11-24NICER1_3_2

2 語彙リストの作成

setwd("NICER_NNS")

tmp0 <- readLines("JPN501.txt")         # JPN501.txtの読み込み
## Warning in readLines("JPN501.txt"): 'JPN501.txt'
## で不完全な最終行が見つかりました
tmp1 <- grep("\\*JPN", tmp0, value=T)   # 本文部分の *JPNで始まる行を取る
tmp2 <- gsub("\\*JPN501:\t", "", tmp1)  # 不要な部分の削除
tmp3 <- strsplit(tmp2, " ")             # 文を単語ごとに切り分ける
tmp4 <- unlist(tmp3)                    # 「リスト」の「枠を」はずして、すべての単語をフラットに
tmp5 <- sort(tmp4)                      # アルファベット順に並べ替え
length(tmp5)                            # 単語リストの要素数を数える:「述べ語数」(Token)
## [1] 322
tmp6 <- table(tmp5)                     # 一覧表の作成
length(tmp6)                            # 見出し語の数が「異なり語数」(Type)
## [1] 166
write.table(tmp6, "../tmp6.txt")           # 一覧表をファイルに保存

2.1 ほかのファイルでも語彙リストを作り、比較してみる。

  • NS501.txt
  • 基本上のスクリプトと同じ(一部ファイル名など変更)
setwd("NICER_NS")

tmp0 <- readLines("NS501.txt")          # NS501.txtの読み込み
tmp1 <- grep("\\*NS", tmp0, value=T)    # 本文部分の *NSで始まる行を取る
tmp2 <- gsub("\\*NS501:\t", "", tmp1)   # 不要な部分の削除
tmp3 <- strsplit(tmp2, " ")             # 文を単語ごとに切り分ける
tmp4 <- unlist(tmp3)                    # 「リスト」の「枠を」はずして、すべての単語をフラットに
tmp5 <- sort(tmp4)                      # アルファベット順に並べ替え
length(tmp5)                            # 単語リストの要素数を数える:「述べ語数」(Token)
## [1] 736
tmp6 <- table(tmp5)                     # 一覧表の作成
length(tmp6)                            # 見出し語の数が「異なり語数」(Type)
## [1] 404
write.table(tmp6, "../tmp6_ns501.txt")     # 一覧表をファイルに保存

2.2 語彙リストとして不完全

2.2.1 句読点の削除:正規表現で [[:punct:]]

2.2.2 大文字小文字の混在: tolower()

2.2.3 空の要素の削除: イディオム 変数 <- 変数[変数 != “”]

  • 変数の要素のうち、要素が空(““)ではない(!=)要素だけにする
setwd("NICER_NNS")

tmp0 <- readLines("JPN501.txt")         # 
## Warning in readLines("JPN501.txt"): 'JPN501.txt'
## で不完全な最終行が見つかりました
tmp1 <- grep("\\*JPN", tmp0, value=T)   # 
tmp2 <- gsub("\\*JPN501:\t", "", tmp1)  # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 句読点の削除
tmp2c <- tolower(tmp2b)                 # 全部小文字に変換

tmp3 <- strsplit(tmp2c, " ")            # 文を単語ごとに切り分ける
tmp4 <- unlist(tmp3)                    # 「リスト」の「枠を」はずして、すべての単語をフラットに

tmp4 <- tmp4[tmp4 != ""]                # 空の要素の削除

tmp5 <- sort(tmp4)                      # アルファベット順に並べ替え
length(tmp5)                            # 単語リストの要素数を数える:「述べ語数」(Token)
## [1] 319
tmp6 <- table(tmp5)                     # 一覧表の作成
length(tmp6)                            # 見出し語の数が「異なり語数」(Type)
## [1] 134
write.table(tmp6, "../tmp6.txt")           # 一覧表をファイルに保存

2.3 フォルダー内のすべてのファイルをまとめて語彙リストを作ってみよう。

2.3.1 フォルダー内のすべてのファイルを対象にする

file.zenbu <- list.files()           # ディレクトリー内の全ファイルのリスト作成

ruiseki <- ""                        # 結果を入れる入れ物を準備(文字列)

for (i in file.zenbu){               # ファイルのリストから一つずつ取り出して i に入れる

  yomikomi <- readLines(i, warn=F)   # i から読み込んだものを、yomikomi に入れる
  
  ruiseki <- c(ruiseki, yomikomi)    # 読み込んだ結果を、ruisekiの中に c()を使って追加していく
}
setwd("NICER_NNS")

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # 
  ruiseki <- c(ruiseki, yomikomi)    # 
}

#tmp0 <- readLines("JPN501.txt")           # ファイル一つ読み込む代わりに

tmp1 <- grep("\\*JPN", ruiseki, value=T)   # 全部読みこんだ ruiseki を対象に
tmp2 <- gsub("\\*JPN...:\t", "", tmp1)  # 数字3桁は、文字三つを正規表現で

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

tmp5 <- sort(tmp4)                      # 
length(tmp5)                            # 
## [1] 104932
tmp6 <- table(tmp5)                     # 
length(tmp6)                            # 
## [1] 4619
write.table(tmp6, "../jpn_all_goi.txt")           # ファイル名を指定

2.4 同様に、母語話者データ全部の語彙リストを作成

  • 母語話者と、学習者と、行頭のスピーカーコードが違う
  • 正規表現でまとめられれば、スクリプトは共通で使える
setwd("NICER_NS")                       # ディレクトリーを指定

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # 
  ruiseki <- c(ruiseki, yomikomi)    # 
}

tmp1 <- grep("\\*(JPN|NS)", ruiseki, value=T)   # (JPN|NS)
tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)  # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

tmp5 <- sort(tmp4)                      # 
length(tmp5)                            # 
tmp6 <- table(tmp5)                     # 
length(tmp6)                            # 
write.table(tmp6, "../ns_all_goi.txt")    # ファイル名を指定

3 語彙の多様性指標

3.1 TypeとToken:Type/Token Ratio

  • Type: 異なり語(重複なし)

  • Token: 述べ語(重複あり)

  • 異なり語数を述べ語数で割った比率

    たくさんの種類の単語を使ってるほど、1に近くなる。

    “I like apples. I like oranges. I like bananas.”
     Token: 9
     Type: 5
     TTR: 5/9= 0.56
    
    “I like apples. I love oranges. I adore bananas.”
      Token: 9
      Type: 7
      TTR: 7/9= 0.78

3.1.1 TypeとTokeを出力する

  • 語彙リスト作成スクリプトの修正
  • 表を作る代わりに、重複のない要素のリスト: unique()
setwd("NICER_NNS")                       # ディレクトリーを指定

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # 
  ruiseki <- c(ruiseki, yomikomi)    # 
}

tmp1 <- grep("\\*(JPN|NS)", ruiseki, value=T) #
tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)   # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

token.list <- sort(tmp4)                      # 並べ替え終わった時点でtokenの単語リスト
type.list <- unique(token.list)                    # tokenの重複をなくしてtypeの単語リスト

token <- length(token.list)
type <- length(type.list)

token
## [1] 104932
type
## [1] 4619

3.1.2 語彙の多様性指標TTRを出すようにスクリプトを修正してみよう

## [1] 0.04401898

3.1.3 母語話者データのTTRを出してみよう

## [1] 0.1011158

3.2 個々のエッセイごとにTTRを計算する

  • これまではすべてのファイルをまとめて全体で処理していた。
  • すべてのファイルを読み込んでから、TTRを計算する処理をしていた。
  • 個々のエッセイごとにTTRを計算するには、、、
  • ファイルを読み込むたびに、TTRを計算するようにする。
setwd("NICER_NNS")                       # ディレクトリーを指定

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # i番目のファイルを読み込んだ状態
  
# ruiseki <- c(ruiseki, yomikomi)    # 累積しないで、ファイルごとにTTRを出す
  
# }                                  # ココで閉じない。

#tmp1 <- grep("\\*(JPN|NS)", ruiseki, value=T) # 変数名に注意
tmp1 <- grep("\\*(JPN|NS)", yomikomi, value=T) # 変数名に注意

tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)   # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

token.list <- sort(tmp4)                      # 並べ替え終わった時点でtokenの単語リスト
type.list <- unique(token.list)                    # tokenの重複をなくしてtypeの単語リスト

token <- length(token.list)
type <- length(type.list)

TTR <- type/token                             # typeをtokeで割る

print(TTR)                                    # 画面に出力する命令 print()

}                                             # ここでforを閉じる

3.3 個別の結果を、まとめて一覧表にして保存

  • 結果を累積して保存していく

    kekka <- c(kekka, TTR)

setwd("NICER_NNS")                       # ディレクトリーを指定

kekka <- NULL                           # 結果を保存する変数を中身なしで用意しておく

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # 

tmp1 <- grep("\\*(JPN|NS)", yomikomi, value=T) # 

tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)   # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

token.list <- sort(tmp4)                     # 
type.list <- unique(token.list)              # 

token <- length(token.list)
type <- length(type.list)

TTR <- type/token                             # typeをtokeで割る

kekka <- c(kekka, TTR)                                    # 結果を累積していく

}                                             # 

write.table(kekka, "../TTR.NNS.kekka.txt")    # ファイルに保存
#write.table(kekka, "../TTR.NNS.kekka.txt", col.names=F, row.names=F)    # 見出しと行番号を書き出さないオプション

3.4 関連するほかの要素も合わせてファイルに保存

  • ファイル名、Typeの数、Tokenの数

  • ファイル名は、i

  • 要素を連結する命令: paste()

    • 要素間の区切りをタブ記号にするオプション , sep="\t"
  • write.table() のオプション , quote = F 引用符を付けない

setwd("NICER_NNS")                       # ディレクトリーを指定

kekka <- NULL                           # 結果を保存する変数を中身なしで用意しておく

file.zenbu <- list.files()           # 
ruiseki <- ""                        # 

for (i in file.zenbu){               # 
  yomikomi <- readLines(i, warn=F)   # 

tmp1 <- grep("\\*(JPN|NS)", yomikomi, value=T) # 

tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)   # 

tmp2b <- gsub("[[:punct:]]", "", tmp2)  # 
tmp2c <- tolower(tmp2b)                 # 

tmp3 <- strsplit(tmp2c, " ")            # 
tmp4 <- unlist(tmp3)                    # 

tmp4 <- tmp4[tmp4 != ""]                # 

token.list <- sort(tmp4)                     # 
type.list <- unique(token.list)              # 

token <- length(token.list)
type <- length(type.list)

TTR <- type/token                             # 

TTR.index <- paste(i, type, token, TTR, sep="\t")  # ファイル名, Type, Token, TTRの連結

kekka <- c(kekka, TTR.index)            # 


}                                             # 

write.table(kekka, "../TTR.JPN.kekka.txt", col.names=F, row.names=F, quote = F)    # 見出しと行番号を書き出さないオプション
  • これで、フォルダー内のすべてのファイルの語彙多様性指標を出力するプログラムが完成

4 作ったスクリプトを独自の命令としてまとめる: function()

独自の名前 <- function(){
  この間にスクリプトを書いておく
  この間にスクリプトを書いておく
  この間にスクリプトを書いておく
}
独自の名前 <- function(){
  この間にスクリプトを書いておく
  この間にスクリプトを書いておく
  この間にスクリプトを書いておく
  return(結果)
}

4.1 語彙多様性指標を出す命令myTTR()

  • 独自に作ったことが分かるように、myというのを付けておく習慣
myTTR <- function(){                    # 独自の命令function()ここから
  
# ------------------------------------------この部分は上と同じ
  kekka <- NULL                                     #
  file.zenbu <- list.files()                        # 
  ruiseki <- ""                                     # 
  
  for (i in file.zenbu){                            # 
    yomikomi <- readLines(i, warn=F)                # 
    tmp1 <- grep("\\*(JPN|NS)", yomikomi, value=T)  # 
    tmp2 <- gsub("\\*(JPN|NS)...:\t", "", tmp1)     # 
    tmp2b <- gsub("[[:punct:]]", "", tmp2)          # 
    tmp2c <- tolower(tmp2b)                         # 
    tmp3 <- strsplit(tmp2c, " ")                    # 
    tmp4 <- unlist(tmp3)                            # 
    tmp4 <- tmp4[tmp4 != ""]                        # 
    token.list <- sort(tmp4)                        # 
    type.list <- unique(token.list)                 # 
    token <- length(token.list)                     #
    type <- length(type.list)                       #
    TTR <- type/token                               #
    TTR.index <- paste(i, type, token, TTR, sep="\t")
    kekka <- c(kekka, TTR.index)                    # 
  }                                                 # forを閉じている
#---------------------------------------------ここまで上と同じ
return(kekka)                           # function()の結果を出力する

}                                       # 独自の命令function()ココまで
  • これを実行ると、myTTRというなまえで保存される
  • それに()を付けるとプログラムとして実行される。

4.1.1 母語話者データの語彙多様性指標をファイルごとに出力する

setwd("NICER_NS")

result <- myTTR()               # TTRの指標の結果を保存して、

write.table(result, "../TTR.NS.kekka.txt", col.names=F, row.names=F, quote = F)

5 本日の課題

5.1 NICERの起源であるNICEについて、同様に、学習者と母語話者とでTTRをだしてみよう。

5.1.2 NICE 2.3 ファイル構成

●NICE Set 1: 当初の科研で収集した500語目安の指示が有ったデータのうち、
       <font color="red">NICE Set 1A: 同一著者による執筆が初回のもの(161ファイル)</font>
       NICE Set 1B: 同一著者による執筆が2回目、3回目のもの( 29ファイル)
●NICE Set 2: NICE 2.0で追加した500語目安の指示が無かったデータのうち、
       NICE Set 2A: 同一著者が二つのトピックで執筆しているもの(120ファイル)
       NICE Set 2B: 同一著者が一つのトピックで執筆しているもの(13ファイル)
●NS
 NS1: 当初の200
 NS2: その後の追加10
  • NICE Set 1 vs. NS1 で調べてみましょう。

5.2 チャレンジ課題: 他のコーパスでもやってみよう

  • データのフォーマットに注意。フォーマットに合わせて整形処理が必要。

5.2.1 ICNALEでも調べてみよう。

https://language.sakura.ne.jp/icnale/download.html

5.2.2 COCA: Corpus of Contemporary American English

5.2.3 MICUSP: The Michigan Corpus of Upper-Level Student Papers