『伝道の書』を品詞分解する - pos_tag によるカウント -

 先日テキストのトークン化を試してみました。内容によって大きく変わりそうですが、英文は、どういった品詞がどのような割合の下に成り立っているのでしょうか。前回に引き続き、『伝道の書』を品詞分解してみました。

 

目次

1.nltk の品詞取得

 1-1.品詞取得の command

 1-2.品詞タグの種類

2.『伝道の書』の品詞構成

3.品詞別高使用単語上位 20

4.まとめと課題

 

1.nltk の品詞取得

1-1.品詞取得の command

  トークン化したテキストの、単語の品詞は次のように取得できます。ついでに、どんな結果になるのか、print してみました。

pos = nltk.pos_tag(clean_token)  # clean_token : tokenized text
print (pos)
[('ecclesiastes', 'VBZ'), ('preacher', 'RB'), ('1:1', 'CD'), ('words', 'NNS'), ('preacher', 'RB'), ('son', 'NN'), ('david', 'NN'), ('king', 'VBG'), ('jerusalem', 'NN'), ('1:2', 'CD'), ('vanity', 'NN'), ('vanities', 'NNS'), ('saith', 'VBP'), ('preacher', 'JJ'), ......

 左が単語、右が品詞を表すタグのリストが得られます。

1-2.品詞タグの種類

 では、品詞タグにはどのようなものがあるのでしょうか?公式ページにもありますが、次の command でタグの一覧や説明が見られます。

nltk.help.upenn_tagset()   # All list of pos tag
nltk.help.upenn_tagset('VBP')   # Description about 'VBP' tag

www.nltk.org

 tag は全部で 36 に分けられています。一覧は、上の command、あるいは例えば以下のページをご参照頂くとして、

www.ling.upenn.edu

大まかに次のように分けてみました。

  ①名詞系(NN、NNS、NNP、NNPS)

  ②動詞系(VB、VBD、VBG、VBN、VBP、VBZ)

  ③形容詞系(JJ、JJR、JJS)

  ④副詞系(RB、RBR、RBS

  ⑤疑問詞系(WDT、WP、WP$、WRB)

  ⑥その他(接続詞など)

果たしてかなりザックリですが、トークン化した『伝道の書』がどのような品詞比率になっているか、実際に図示してみました。

 

2.『伝道の書』の品詞構成

 トークン化では、大文字を小文字にして単語を統一し、カンマ等の記号は省きました。先ほどの pos_tag を使って上位 20 のタグを図示したものが下のグラフです。

 一目見て分かるように、圧倒的に名詞(NN)が多く、続いて形容詞(JJ)、次に聖書特有の、文頭につく"1:1" のような基数(CD)が続きます。その後は、副詞(RB)、動詞系(VBD、VBP、VB、VBN、VBZ、VBG)が目立ちます。先日トークン化した際には、一番多く使われていた単語は、"shall"、続いて"man" でしたが、全体としては名詞が一番多いようですね。

f:id:ohigehige:20201103195655p:plain

上の script はこんな感じです。

import pandas as pd
import nltk
from nltk import word_tokenize,sent_tokenize
import seaborn as sns
import matplotlib.pyplot as plt

with open("Ecclesiastes.txt", mode="r",encoding="ms932", errors="ignore") as file:
ecclesia = file.read()

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)

word, hinshi = zip(*pos)        # create dataframe
df = pd.DataFrame({'Word':hinshi})

fig=plt.figure(figsize=(7,7))
sns.set()
sns.set_style=("darkgrid")
sns.countplot(y="Word", data=df, palette="magma",
order=df.Word.value_counts().iloc[:20].index)

 

3.品詞別高使用単語上位 20

 やや繰り返しになりますが、単語全体の使用頻度の上位ではなく、品詞別に使用率の高い単語上位 20 をまとめてみました。

 まずは名詞から。

f:id:ohigehige:20201103203719p:plain

有難い言葉が並びますが、hath は動詞ですし、wise は形容詞ですね。

 続いて形容詞です。

f:id:ohigehige:20201103203928p:plain

こちらも、sun、god、labour など名詞と思われる単語が混じっています。

 では動詞はどうでしょう。

f:id:ohigehige:20201103204557p:plain

こちらも、god、labour、king といった名詞が混じっていますね。

 最後に副詞を調べてみます。

f:id:ohigehige:20201103205106p:plain

 こちらもやはり、数単語は副詞で無さそうなものが混じっています。ちなみに、品詞別の図示は、Dataframe を作った 2 行を以下の script に変えただけです。

wrd_VBP = []
for i in range(len(pos)):
if "RB" in pos[i][1]:      # RB は副詞。欲しい tag をどうぞ
 wrd_VBP.append(pos[i][0])

df = pd.DataFrame({'Word':wrd_VBP})

 

4.まとめと課題

 以上、『伝道の書』を品詞分解してみました。大筋はかなり納得、繰り返される言葉から、内容が垣間見られる想いがしますが(ちょっと言い過ぎですね)、どの品詞分解に関しても、違う品詞の単語が混じってしまうということは、トークン化からタグ付けの間にもう一手間必要なようですね。

 ライブラリの使い方にとどまらず、英語の構造や語源自体の理解も必要なようで、やはりなかなか奥が深そうです。

 

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