こんにちは、がこないのクボタです。
今回はプログラミングを使って、各大学の問題における単語帳のカバー率を、どのような手順で、どのような基準で行っているのか説明したいと思います。
今まで各検証の前に説明していた部分を独立してここに書き起こしました。毎回同じ説明をコピペするのは、みなさんにとっても邪魔ですし、SEO的な評価にとっても重複的なコンテンツとしてマイナスですからね。
なおこのブログ上で使用している自然言語処理という言葉ですが、本来はもっと大きな言語全体とそれにまつわるプログラミングの枠組みで使われる言葉です。
ものすごく平たく言って、何か言語解析をした結果から得られるデータをもとに、さまざまな検証していくことだと思ってください。
大まかな流れ
問題文をPDFで用意
基本的に毎回使用する言語はPython、自然言語処理ライブラリとしてSpacyになります。実際のコードを詳しく解説すると長くなるので大まかな図で説明します。
まず実際の問題をPDFで用意し、それを一旦グーグルドライブに入れます。
このあとグーグルドキュメント上でファイルを開くと、PDFの中の文字が文字認識され、抽出 (つまりコピペ可能な状態)できるようになります。
一旦テキストファイルに全ての文字をコピー、ペーストします。
PDFからの文字認識機能は精度もまだ完璧ではなく、例えば問題の選択肢に出てくる余分な文字、記号、番号、また、ページ部分の番号なども拾ってしまうため、Python上でそれらの不要な部分は取り除く処理をします。
また、後から単語帳と照らし合わせる作業の際、大文字と小文字は別として扱われます。
つまり、例えば"have"と"Have"は違う単語扱いされてしまうので、各文頭の大文字は小文字化させます。ここまでが下地処理。
自然言語処理ライブラリで下地処理
ここから自然言語ライブラリのSpacyを使用します。
先ほど下地処理された本文をSpacyに読み込ませることで、全ての単語がバラバラで配列に入れられます。
しかしこの状態では、三単元のsや過去形、過去分詞形、不規則変化や複数形などは全て違う単語に見えてしまいます。例えば、後から出てくる単語帳の中に"create"があったとして、本文中の"created"のような過去形は一致したとみなされません。
そこで自然言語処理として、これらの単語を全て元の見出し語に戻す処理をかけます。(これをlemmatizationと言います)
図にあるように例を挙げると
"He has two cameras."
という文は、そのまま配列に入れるだけでは
"he"、"has"、"two"、"cameras"
となってしまうのですが、見出し語処理をすることによって
"he"、"have"、"two"、"camera"
となり、後から単語帳との照らし合わせができるようになります。
単語帳との照合
これでやっと、下地処理を全て済ませた本文の単語の配列を用意することができました。この配列に対して、もともと用意していた単語帳の配列(全単語をあらかじめ手打ちで入れておきました)を照合させます。具体的にはプログラミングのfor文などの「繰り返し構文」を使い、本文の単語を一つずつ取り出します。
そこでif文などの条件文で「もしその単語が対象の単語帳の配列内の単語と一致すれば、それを新しい配列(最終結果)に入れていく、一致しなければ無視して次の単語を回す」という内容のコードを書けば完成です。
文字抽出の段階の精度も100%と断言はできませんし、lemmatizationの精度も100%狙った形に戻ってくれる保証はありません。
あくまでも私のプログラミングの技量含め、参考的なものとして各大学のカバー率はお使いください。
的中率が示すもの
なお、毎回の検証でも念を押して説明していますが、的中率の高さがその単語帳の優秀さを示すとは限りません。
基礎的な単語もマニアックな難単語も、的中していれば同じ1単語扱いです。
よって中学レベルに近づけば近づくほど、どんな英文でも基本的には的中率が跳ね上がることになります。
普段の記事内においては、難関大学や上級者向けの単語帳の場合、そこから基礎レベルを取り除く処理などの工夫も凝らしています。
目先の数字だけに振り回されないようにお願いします。