『伝道の書』の動詞の Lemmatize を試みる

 前回はテキストの品詞分解を試してみました。動詞には時制があり、形容詞や副詞には比較級があり、と分類すると、品詞のタグが英文の場合、36 にも上ることは、ある意味当然なのかもしれません。しかし、辞書で単語を調べる時のように、各単語をその基本形に帰着させ、基本形の使用頻度を見ることが出来れば、そのテキストの語彙の傾向が抽出できるのではないか、と期待したのですが…。

 

目次

1.動詞の基本形化

 1.1 基本形化の機能 WordNetLemmatizer

 1.2 Lemmatize された動詞の品詞タグの変化

 1.3 Lemmatize された動詞の中身

2.まとめと所感

 

1.動詞の基本形化

 基本形化することですっきり整頓出来そうなトークンとして、まず動詞が思い浮かびました。動詞の品詞タグは 6 つに分かれていますが、時制や人称、活用を統一して把握することが出来れば、品詞タグのばらつきがグッと減るのではないか、と思い、試してみたのですが…。

1.1 基本形化の機能 WordNet Lemmatizer

 公式ページによると、nltk には WordNet Lemmatizer という機能があり、これを使うことで、基本形化が出来るそうです。ただし、WordNet にない単語はそのまま返す、とあります。

www.nltk.org

 WordNet の辞書の中身がどのようなものかは分かりませんが、動詞を対象としてやってみることとします。Lemmatizer は以下の形で使います。

from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
wnl.lemmatize('基本形化したい言葉')

  Lemmatize した動詞群の品詞タグがどう変化するのか、比べてみました。

 

1.2 Lemmatize された動詞の品詞タグの変化

 下図中、左は『伝道の書』をトークン化した単語のうち、動詞系とタグ付けされたものの数、右はトークン化した単語のうち、動詞系とタグ付けされたものを lemmatize し、それについて再度品詞のタグ付けを行ったものの数を表します。 

f:id:ohigehige:20201108154927p:plain

  トークン化しただけでは、動詞過去形(VBD)と区分されるものが最多で、次に現在形(VBP)、原形(VB)、過去分詞(VBN)、3人称単数現在(VBZ)、動名詞または現在分詞(VBG)となっていました。lemmatize すれば、これらが原形もしくは現在形にかなり集約されるのではないかと考えていたのですが、その予想は大きく裏切られ、実際には大半が名詞、あるいは形容詞と品詞タグ付けされ、その上細分化されることとなりました。以下がその code です。

token = nltk.word_tokenize(ecclesia)
stop_words = nltk.corpus.stopwords.words('english')
symbol = ["'", '"', ':', ';', '.', ',', '-', '!', '?', "'s"]
clean_token = [w.lower() for w in token if w.lower() not in stop_words + symbol]
pos = nltk.pos_tag(clean_token)

wrd_VB = []
for i in range(len(pos)):
if "VB" in pos[i][1]:
wrd_VB.append(pos[i])

word, hinshi = zip(*wrd_VB)

lem_word = []
wnl = WordNetLemmatizer()
for s in word:
lem_word.append(wnl.lemmatize(s, pos="v"))

lem_pos = nltk.pos_tag(lem_word)
lem_word, lem_hinshi = zip(*lem_pos)

df = pd.DataFrame({'Word':hinshi})
dg = pd.DataFrame({'Word':lem_hinshi})

fig=plt.figure(figsize=(11,5))
sns.set()
sns.set_style=("darkgrid")

plt.subplot(121)
plt.xlim(0,200)
plt.title('Tokenized Verb Tags')
sns.countplot(y="Word", data=df, palette="magma",
order=df.Word.value_counts().iloc[:20].index)

plt.subplot(122)
plt.xlim(0,200)
plt.title('Lemmatized Verb Tags')
sns.countplot(y="Word", data=dg, palette="magma",
order=dg.Word.value_counts().iloc[:20].index)

  前回試みたように、トークン化した動詞の中には、少なからず違う品詞の単語も混じっていました。それらが Lemmatize の後、元の品詞と判別される可能性は大いにあるように思います。それにしても、500 程度あった動詞タグのうち、280 程度が名詞と形容詞と判別されるのは、ちょっと行き過ぎです。ということで、Lemmatize された動詞の品詞がどう判別されているのか、中身を一部見てみることとしました。

 

1.3 Lemmatize された動詞の中身

print(lem_pos)

 

('ecclesiastes', 'NNS'), ('king', 'VBG'), ('saith', 'JJ'), ('labour', 'JJ'), ('passeth', 'NN'), ('cometh', 'NN'), ('ariseth', 'VBZ'), ('hasteth', 'JJ'), ('arise', 'NN'), ('wind', 'NN'), ('accord', 'NN'), ('run', 'VB'), ('sea', 'NN'), ('come', 'VB'), ('satisfy', 'NN'), ('see', 'NN'), ('fill', 'JJ'), ('hear', 'VB'), ('do', 'VBP'), ('do', 'VB'), ('say', 'VB'), ('see', 'VB'), ('remembrance', 'JJ'), ('come', 'VB'), ('come', 'VBP'), ('give', 'JJ'), ……

 語尾が th の過去形は動詞と判別されず、名詞や形容詞になっています。また、satisfy や fill といった単語も動詞と判別されていないようです。一方、king は動名詞と判別されたようです。

 形容詞や副詞についてもやってみたのですが、トークン化後の分類から、動詞同様に細分化され、余計にわからなくなってしまいました…。

 

2.まとめと所感

 残念ですが、現時点では Lemmatize された動詞の品詞がどうしてこのように変化するのかについて、理由は思いつきません(泣)。Lemmatize した後に pos_tag という操作をすることに問題があるのか、あるいはそもそも古い英語のテキストを対象にしているために誤判別が起きやすいのか、それとも、WordNet という辞書の特徴をもっと理解する必要があるのか。いずれにせよ、ひとまず解決の糸口は思いつかないので、もう少し別のテキストも対象にぼちぼちやることとしました。

 数値化された予測などの正当性が 80 % ということと、言語のような質的データを定量化したものの正当性が 80 % ということには、水準は同じでも、私たちにとっては、やはり意味が異なります。言葉の意味を取り違えても、問題ない場合ももちろんありますが、時としてそれは表現しているものがまったく変わる可能性もあります。言語処理の難しさや面白さはこの点にあるんでしょうね。

 

 今回は単に達成できなかったことの報告となってしまっただけでした。

 最後までお付き合いありがとうございました。