Pythonで遊ぼう!英字新聞の難解度検証
僕がMBA受験をしていた当時から、英字新聞は英文読解力向上によい、という言説があった。当時、自分も仕事の関係でかなりの英文を読んでいたので、大量に英文を読むというのが英語力向上に寄与する感覚は確かにあったのだが、英字新聞に関しては難しいものも多く、教材として考えるのに適切なのかは多少疑問があった。
https://teenkidsnews.com/
疑問ならば分析すればいいじゃない、という声が聞こえてきたので、Pythonで遊びがてら、分析してみることにする。尚、統計的に全く有意でない、所謂Spot Check的な分析なので、参考程度にお考え願いたい。また、Codeも書き散らし気味なので、有識者の皆様におかれては是非コメント欄でご指摘願いたい。
さて、まずは準備である。大きくくくって、必要なFunctionalityは二つ。一つはニュース記事をデータとして一括して収集できること、そして、もう一つはそのニュース記事の難易度を言語学的に判断することである。前者について、僕はスクレイピングは余り経験がないのでどうしようか少し調べたところ、newspaper、というドンピシャなパッケージがPythonであることを発見した(詳細のリンクはこちら)。詳細についての検証はしていないが、いくつかためしに動かしてみて、手作業との違いを確認したところ、かなりいい感じに動いているので、こちらを使うことにする。後者については、textstatというProjectがあり、これまたこういう分析をしようとした場合に定番のようであるので、これを採用する(詳細へのリンクはこちら)。Pythonが素晴らしい点の一つは、言語の使用者が多いため、こういったパッケージが大量に用意されていることにある。
さて、用意ができたらとりあえずCodeを書き始める。パッケージのおかげで特にデザインをする必要すらないので、パッケージのインポート -> ニュース記事の分析 -> アウトプットをCSVで作成、という手順だけざくっと決めて書き始める。尚、実装はJupyter Notebookでやった。
まずパッケージのインストールが必要だ。newspaperとtextstatはないようだったので、pipを使ってインストールした。
pip install newspaper pip install textstat
では早速使うものについてインポートしていこう。
import newspaper
import textstat
import pandas as pd
newspaperに関しては、ArticleとSourceを使う。from newspaper import Article
from newspaper import SourceまずはUSA TodayをSourceとしてやってみよう。target_paper = Source('https://usatoday.com/')target_paper.build()
これでUSA Todayから記事を持ってきて英文にしてくれているはずだ。ローカルのマシンで走らせている結果、記事数は10に抑える。ブルジョワジーの皆様におかれては全記事取得でも問題ないかもしれない。何故なら、おそらくこの方法だと、取得できる記事数に制限があるからだ(例えばUSA Todayに関しては36記事を取得できたが、それしか記事数がないとは考えにくい)。
target = min(size, 10)
print(target)
一つ一つの記事を手作業で分析するのは骨が折れるので、ループを使ってデータを取得した上で、見やすくデータフレームにまとめてみようと思う。まずは空のリストを用意する。
url_list = []取得した記事に対してループを回し、リストに内容を追加していく。記事を取るときは改行の\nがそのまま取得されてしまうので、これはスペースに置き換えておく。
fkg_list = []
dale_list = []
overall_list = []
count_list = []
for i in range(target):
article = target_paper.articles[i]
article.download()
article.parse()
url = article.url
text_data = article.text.replace('\n',' ')
fkg = textstat.flesch_kincaid_grade(text_data)
dale = textstat.dale_chall_readability_score(text_data)
overall = textstat.text_standard(text_data)
count = textstat.lexicon_count(text_data)
url_list.append(url)
fkg_list.append(fkg)
dale_list.append(dale)
overall_list.append(overall)
count_list.append(count)
詳細はtextstatの解説及びWikipedia等に譲るが、このflesch_kincaid_gradeというのは1948年に考案されて以来広く使われている手法で、文としての難解さを、文章の長さと単語の長さというものをベースに検証するものである。dale_chall_readability_scoreは、重要な3,000単語をベースに、文の難易度を測定するものである。この分析では、flesch_kincaid_grade(以下、FKG)を、文法などの文章の構成を含めた全体的な難易度を図るものとし、dale_chall_readability_score(以下、Dale Score)は単語の難易度に重点をあてたものとして考える。尚、text_standardはいろいろな手法を組み合わせた場合の平均難易度のようなものらしいので取ってみたが、正直よくわからないので本稿では無視する。lexicon_countは単語数だ。これをデータフレーム化する。
df= pd.DataFrame(url_list, columns=['URL'])
df_b= pd.DataFrame(fkg_list, columns=['FKG'])
df_c= pd.DataFrame(dale_list, columns=['Dale'])
df_d= pd.DataFrame(count_list, columns=['OA'])
df_e= pd.DataFrame(count_list, columns=['Count'])
ということで、あとはこれをくっつけて一つのデータフレームにすればよい。
df['flesch_kincaid_grade'] = df_b
df['dale_chall_readability_score'] = df_c
df['text_standard'] = df_d
df['word_count'] = df_e
完成!簡単である。
df
と打つと、以下のようなデータが取得できるはずだ。
URL | flesch_kincaid_grade | dale_chall_readability_score | text_standard | word_count | |
---|---|---|---|---|---|
0 | https://usatoday.com/pages/interactives/100000... | -15.7 | 0.00 | 0 | 0 |
1 | https://usatoday.com/story/money/2020/05/21/co... | 26.9 | 9.62 | 1526 | 1526 |
2 | https://usatoday.com/story/entertainment/movie... | 56.6 | 13.52 | 2096 | 2096 |
3 | https://usatoday.com/story/news/nation/2020/05... | 13.0 | 7.70 | 1253 | 1253 |
4 | https://usatoday.com/story/news/nation/2020/05... | 25.9 | 8.92 | 3243 | 3243 |
5 | https://usatoday.com/story/news/nation/2020/05... | 22.8 | 8.62 | 1847 | 1847 |
6 | https://usatoday.com/story/news/nation/2020/05... | 18.9 | 8.32 | 861 | 861 |
7 | https://usatoday.com/story/news/politics/2020/... | 21.6 | 8.79 | 1199 | 1199 |
8 | https://usatoday.com/story/news/politics/2020/... | 36.5 | 10.31 | 530 | 530 |
9 | https://usatoday.com/videos/news/have-you-seen... | 15.4 | 2.77 | 40 | 40 |
違和感があるデータが存在するのがわかる。どうやらビデオの記事も取ってきてしまっているようだ。これを除く。
df = df[df['URL'].str.contains('videos') == False]
もういちど中身を見てみると。
df
URL | flesch_kincaid_grade | dale_chall_readability_score | text_standard | word_count | |
---|---|---|---|---|---|
0 | https://usatoday.com/pages/interactives/100000... | -15.7 | 0.00 | 0 | 0 |
1 | https://usatoday.com/story/money/2020/05/21/co... | 26.9 | 9.62 | 1526 | 1526 |
2 | https://usatoday.com/story/entertainment/movie... | 56.6 | 13.52 | 2096 | 2096 |
3 | https://usatoday.com/story/news/nation/2020/05... | 13.0 | 7.70 | 1253 | 1253 |
4 | https://usatoday.com/story/news/nation/2020/05... | 25.9 | 8.92 | 3243 | 3243 |
5 | https://usatoday.com/story/news/nation/2020/05... | 22.8 | 8.62 | 1847 | 1847 |
6 | https://usatoday.com/story/news/nation/2020/05... | 18.9 | 8.32 | 861 | 861 |
7 | https://usatoday.com/story/news/politics/2020/... | 21.6 | 8.79 | 1199 | 1199 |
8 | https://usatoday.com/story/news/politics/2020/... | 36.5 | 10.31 | 530 | 530 |
ということでちゃんとVideoが除かれていることがわかる(尚、一番上のものはおそらくトップページがなにかだろう。ちゃんとやろうとすると、やはりBeautiful Soupでも使ってスクレイピングする必要があるような気がする)。最後にCSVに出力。
df.to_csv('English',index=False)
ぱっと見てみると、かなり難易度にばらつきがあるのがわかる。TOEFLやGMATでは、そこまで難解な単語は求められないことが多いので、高校生くらいの単語レベルである、7.0 ~ 8.9くらいのDale Scoreが出ているものを選ぶのでよいかもしれない。ただ、FKGに関しては、平均としてかなり高めにグレードレベルが算出されており、かつ、ばらつきが大きい(尚、この後CNNなどでも試してみたが、同じようにかなりばらつきが大きかった)。
データを見た僕の個人的な結論としては、確かに英字新聞は一部タダで読めるし、読解演習に使いたくなる気持ちもわかるのだが、あまりお勧めできない。自分にとってレベルが高すぎる英文を読むのは時間がかかり、勉強の効率が大きく下がるからだ。特に英語で英語を理解できる脳を作るという段階においては、ある程度の量を読む必要があると思っており、難しすぎる英文にくらいつくよりは、自分にあったレベルの英文を多読する方が効率がよいと思う。レベルのばらつきが大きいものを教材として使用するのは難しい。
最後になるが、いくつかTeen向けのニュースサイトについても調べてみた。結果はここには出さないが、全体的にFKGもDale Scoreも低く抑えられているものが多く、ばらつきも小さめに出たので、ニュースを読みつつ英語を勉強する、ということにこだわるのであれば、こうったサイトを試してみてもよいのかもしれない。ご参考まで。
https://www.tweentribune.com/ https://teenkidsnews.com/
コメント
コメントを投稿