学習者言語の分析(基礎)第5回 2

  • 5.3 語彙の知識
    • 5.3.1 語彙の多様性の操作化
    • 5.3.2 語彙の洗練度の操作化
  • 練習問題

5.3 語彙の知識¶

  • 第一言語の発達において語彙の知識は重要な研究対象である。
  • 学習者言語の発達においても同様であり、学習者の熟達度を測る指標のひとつとして語彙の知識が用いられてきた。
  • 多くの場合、語彙の知識は以下の3つに分類される。
    1. 語彙の多様性
    2. 語彙の洗練性
    3. 語彙の深さ
  • この3つに下位分類された語彙の知識は次のように操作化(operationalization)される。
    1. どれだけ多くの種類の単語が使用されているか。
    2. 頻度が低い単語がどれだけ使用されているか。
    3. (学習者コーパスで妥当な操作化はできなそう)

5.3.1 語彙の多様性の操作化¶

  • 語彙の多様性は、産出されたテキストあるいはスピーチにどのくらい異なる語が含まれているかということである。
  • つまり、Type Token Ratio (TTR)が基本的な考え方となるが、TTRはテキストの長さに依存するため、さまざまな計算方法が提案されている。
  • 以下の式で、Vは異なり語(type)の数、Nは総語数(token)である。

$$ Type Token Ratio = \frac{V}{N} $$

$$ Mean word frequency = \frac{N}{V} $$

$$ Guiraud = \frac{V}{\sqrt{N}} $$

$$ Herden's C = \frac{log V}{log N} $$

  • the measure of textual lexical diversity (MTLD)
    1. TTRが0.72(デフォルト)になるまでテキストの最初から単語をカウントする。
    2. TTRが0.72を超えたら、語数を保存し、1に戻る。
    3. テキストの最後の単語までカウントしたら終了。
    4. 保存した単語数の平均値を計算する。

MTLDを計算してみよう。

In [11]:
# テキストの読み込みと単語分割
f = open("../DATA02/NICE_NNS2/JPN002.txt","r")
text = f.read()
from nltk import word_tokenize
words = word_tokenize(text)
In [12]:
# TTRの計算
len(list(set(words)))/len(words)
Out[12]:
0.44387755102040816
In [13]:
#MTLDの計算
MTLD = []
tokens = []
types = []

for w in words:
    tokens.append(w)
    if w not in types:
        types.append(w)
    ttr = len(types) / len(tokens)
    if ttr < 0.72:
        MTLD.append(len(tokens))
        types = []
        tokens = []

sum(MTLD)/len(MTLD)
Out[13]:
61.166666666666664

パッケージを用いた計算

In [14]:
from lexical_diversity import lex_div as ld
flt = ld.flemmatize(text)
In [15]:
# TTR
ld.ttr(flt)
Out[15]:
0.4376899696048632
In [16]:
# Root TTR (Guiraud)
ld.root_ttr(flt)
Out[16]:
7.938976988447586
In [17]:
# Log TTR (Herdan's C)
ld.log_ttr(flt)
Out[17]:
0.8574471672439313
In [18]:
# MTLD
ld.mtld(flt)
Out[18]:
54.833333333333336

5.3.2 語彙の洗練度の操作化¶

  • 使用している語彙が洗練された(sophisticated)かどうか。
  • 学習者言語では、語彙が洗練されていることが熟達度を示す。
  • 学習者の産出語彙がどの程度洗練されているかは、その単語の出現頻度を参照する。
  • 単語の出現頻度は大規模なコーパスにおける出現頻度を参照する。
  • 今回はBritsh National Corpus (BNS)を参照コーパスとする。
In [19]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import spacy
nlp = spacy.load("en_core_web_sm")
In [20]:
# British National Corpusの頻度データ読み込み
df = pd.read_csv("../DATA01/BNC.csv",index_col=0)

単一ファイルの語彙ランクの抽出

In [21]:
f = open("../DATA02/NICE_NNS2/JPN002.txt","r")
text = f.read()
In [22]:
doc = nlp(text)

tmp = []
for token in doc:
    w = token.lemma_.lower()
    if not df[df["Word"] == w].empty:
        tmp.append(min(df[df["Word"] == w]["Rank"].values))

複数ファイルの語彙ランクの抽出

In [23]:
import os
files_ns = os.listdir("../DATA02/NICE_NS/")
files_nns = os.listdir("../DATA02/NICE_NNS/")
In [24]:
T_ns = []
T_nns = []

for i in files_ns:
    f = open("../DATA02/NICE_NS/"+i,"r")
    text = f.read()
    T_ns.append(text)
    
for i in files_nns:
    f = open("../DATA02/NICE_NNS/"+i,"r")
    text = f.read()
    T_nns.append(text)
In [25]:
BNC_ns = []
BNC_nns = []

for i in T_ns:
    tmp = []
    doc = nlp(i)
    for token in doc:
        w = token.lemma_.lower()
        if not df[df["Word"] == w].empty:
            tmp.append(min(df[df["Word"] == w]["Rank"].values))
    BNC_ns.append(tmp)
    
for i in T_nns:
    tmp = []
    doc = nlp(i)
    for token in doc:
        w = token.lemma_.lower()
        if not df[df["Word"] == w].empty:
            tmp.append(min(df[df["Word"] == w]["Rank"].values))
    BNC_nns.append(tmp)
In [26]:
BNC_ave_ns = []
BNC_ave_nns = []

for i in BNC_ns:
    BNC_ave_ns.append(np.average(i))
    
for i in BNC_nns:
    BNC_ave_nns.append(np.average(i))
In [27]:
labels = ["NS","NNS"]
plt.hist([BNC_ave_ns,BNC_ave_nns],bins="auto",label=labels)
plt.legend()
Out[27]:
<matplotlib.legend.Legend at 0x17e0ca7f0>
No description has been provided for this image

練習問題¶

ここまで扱ってきたデータの英語学習者に対して、部分的に評価値が付与されています。評価値は"../DATA02/nice_evaluation.csv"に保存されています。評価された作文は"../DATA02/NICE_NNS2"に保存されています。品詞の頻度、依存関係の頻度、語彙の多様性、語彙の洗練度に関する特徴量のひとつ(あるいは複数)を用いて自動採点システムを構築しなさい。