見出し画像

【自然言語処理】複数の教科書に掲載された単語を比較する その2

前回の記事を書いてから、すっかり時間が空いてしまいました。この期間、何もしてなかったのではなく、せっせと教科書の単語のリストを作っていたのです。
一度できあがってしまえば、あとはGoogleのスプレッドシートを見ながら、「あーでもない」、「こーでもない」と考えることができます。だけど、どんなときでも準備の段階が時間がかかります。

改めて、なんで「教科書の単語を比較する」というものを進めようと思ったかというと、入試問題の予測がしたいんですよね。
入試問題の予測とは何かについて説明したいんですけど、受験生はみんな合格するために頑張っていて、合格するためには知識の蓄積が大切で、やっぱり覚えていないとボーダーラインを越えることって難しい。
でも、最後の最後、「あっ!これは直前に見たものだ!!」ってなって、それが最後の一押しとなって、受験に合格することができたら、それはとっても嬉しいことだと思うのです。

そのための分析の最初の一歩が「教科書の単語を比較する」です。このあとの予定では(1)入試に出題された文章の分析、(2)単語抽出のためのフィルターの作成、(3)単語の抽出、(4)単語の分類、(5)出題予測のランキング作成 を進めていきます。

今回は最初の一歩である各教科書に掲載された単語のリストを完成させます。今後の土台になるもの。
それにしても時間がかかりました...!

前回の記事では英語の教科書6冊中2冊だけの単語リストを作成しました。その後、6冊全ての教科書に掲載された単語のリストを追加しました。

今回の記事では(1)6冊分の教科書に掲載された単語に固有IDを振る、(2)教科書ごとの掲載有無を整理する、(3)単語リストの地名や人物名などの固有表現を抽出し、教科書の特徴をみる を書いていきます。

作業の流れ

前回に引き続き、プログラムは主にGoogleのcolaboratoryを用いました。
今回は「HereWeGo」と「NEW CROWN」、「BLUE SKY」、「ONE WORLD」、「SUNSHINE」、「NEW HORIZON」の教科書の単語リストを作成し、csvで保存します。

No,Word,Textbook
1,a,HereWeGo
2,able,HereWeGo
3,Aboriginal people,HereWeGo
4,about,HereWeGo
5,above,HereWeGo
6,abroad,HereWeGo
7,accept,HereWeGo
8,access,HereWeGo
9,ache,HereWeGo
10,achoo,HereWeGo
11,across,HereWeGo
12,act,HereWeGo
13,action,HereWeGo
14,active,HereWeGo
15,activity,HereWeGo
16,actor,HereWeGo
17,actually,HereWeGo
18,address,HereWeGo
19,admire,HereWeGo
20,adult,HereWeGo
...
11441,it's,NEWHORIZON
11442,I've,NEWHORIZON
11443,mustn't,NEWHORIZON
11444,she's,NEWHORIZON
11445,that's,NEWHORIZON
11446,there's,NEWHORIZON
11447,they'll,NEWHORIZON
11448,they're,NEWHORIZON
11449,wasn't,NEWHORIZON
11450,we'll,NEWHORIZON
11451,we're,NEWHORIZON
11452,weren't,NEWHORIZON
11453,we've,NEWHORIZON
11454,what's,NEWHORIZON
11455,when's,NEWHORIZON
11456,where's,NEWHORIZON
11457,who's,NEWHORIZON
11458,won't,NEWHORIZON
11459,you'll,NEWHORIZON
11460,you're,NEWHORIZON
11461,you've,NEWHORIZON

6冊の教科書の合計単語数は11,461語(!!)

英単語に固有IDを振る

import collections
import numpy as np
import csv
import pandas as pd

# GoogleDriveをマウント
from google.colab import drive
drive.mount('/content/drive')

# CSV 読み込み
data = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/0001_textbookAnalytics/textbook_wordlist.csv')

# リストに変換
word_list = data['Word'].tolist()
# リストを'¥'で結合
sentence = '¥'.join(word_list)

# 固有Idを振る
word2id = collections.defaultdict(lambda: len(word2id))
def convert_word(sentence):
  return [word2id[word] for word in sentence.split('¥')]

print("id_sentence :", *convert_word(sentence) )
print("dict        :", dict(word2id) )
word_dict = dict(word2id)

# dictをデータフレームに変換
df = pd.json_normalize(word_dict)
# 行列を転置
df = np.transpose(df)
print(df)

# 前回からの変更点 indexを固有IDに設定
df['word'] = df.index
df.set_index('word_ID', inplace=True)

# csvで出力
df.to_csv('textbook2wordid.csv')

6冊分の教科書単語に固有IDを振り、リストを作成しました。前回までのプログラムとの変更点はデータベースのインデックスを固有IDに設定しなおした点です。

教科書ごとの掲載有無の表を作成

各教科書ごとの掲載単語一覧の一部
各教科書ごとの掲載単語一覧の一部

作成した結果、全教科書に掲載された単語の合計数は4466語に及びました。
新しい学習指導要領では「1600~1800語程度」を学ぶことを目標にしていることを考えると、かなり多いですね。
今、TOEICの勉強をしていて、『TOEIC L&R TEST 出る単特急金のフレーズ』と『銀のフレーズ』を使っているのですが、それでも「こんな単語が乗ってるのか?!」と思うほどでした。

【英語】教科書ごとの単語掲載数

それぞれの教科書に掲載された単語は「HereWeGo」 2,293語、「NEW CROWN」 2,156語、「BLUE SKY」 1,737語、「ONE WORLD」 1,777語、「SUNSHINE」 1,863語、そして「NEW HORIZON」 1,682語。
「Here We Go」と「New Crown」が突出して多いことがわかります。教科書間で掲載されている単語数は異なりますね。
掲載単語数の違いは最大611語に及びます。

各教科書の特徴をみてみる

自然言語処理のstanzaを用いて、固有表現を抽出します。それぞれのエンティティはNORP「民族名」、LOC「地域名」、GPE「国・土地名」、DATE「月・日・曜日」、LANGUAGE「言語」、MONEY「通過」、CARDINAL「数字」、ORDINAL「序数」、ORG「組織」、TIME「時間」、PERSON「人物名」、EVENT「行事」、PERCENT「パーセント」、QUANTITY「量」、PRODUCT「製品名」、WORK_OF_ART「作品」、FAC「施設名」と日本語訳しています。

# 空のリストを作成
word_list = []
token_tmp = []

# 固有IDを振った単語リストをさらにTokenizeし、固有表現を抽出
for word_id, words in df.iterrows():
  for word in words:
    doc = nlp(words.word)
    for sent in doc.sentences:
      for token in sent.tokens:
        token_tmp = []

        token_tmp.append(word_id)
        token_tmp.append(words.word)
        token_tmp.append(token.text)
        token_tmp.append(token.ner)
        
        word_list.append(token_tmp)

# リストをCSVで出力
# CSVファイルの保管先
csv_path = "/content/drive/MyDrive/Colab Notebooks/0001_textbookAnalytics/"
# CSVファイル名
csv_name = 'ner_word_list.csv'
# リストをCSVファイルに出力('w'の場合は、新規作成)
with open(csv_path+csv_name, 'w', newline=''as f:
    writer = csv.writer(f)
    writer.writerows(word_list)

参考サイト

作成したリスト

固有表現リストの一部

もっとも多く掲載されている人物名

教科書に掲載された人物名の一部

Bobでした。
もっとよく見ていくと、興味深い人物名が登場するのですが、今回はここまで。

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?