東北大乾・岡崎研(現乾・鈴木研)で作成された、新人研修の一つであるプログラミング基礎勉強会の教材『言語処理100本ノック 2020年版』をPython(3.7)で解いた記事です。
今回は第7章:単語ベクトルの「65. アナロジータスクでの正解率」を解説します。
独学でPythonを勉強してきたので、間違いやもっと効率の良い方法があるかもしれません。
改善点を見つけた際はご指摘いただけると幸いです。
ソースコードはGitHubにも公開しています。
第7章:単語ベクトル
単語の意味を実ベクトルで表現する単語ベクトル(単語埋め込み)に関して,以下の処理を行うプログラムを作成せよ.
第7章: 単語ベクトル – 言語処理100本ノック 2020 (Rev 1) – NLP100 2020
65. アナロジータスクでの正解率
64の実行結果を用い,意味的アナロジー(semantic analogy)と文法的アナロジー(syntactic analogy)の正解率を測定せよ.
第7章: 単語ベクトル – 言語処理100本ノック 2020 (Rev 1) – NLP100 2020
import pandas as pd
df = pd.read_csv("./output/64.txt", sep=" ", header=None)
sem = df[~df[0].str.contains("gram")]
syn = df[df[0].str.contains("gram")]
print("意味的アナロジー正解率:", (sem[4] == sem[5]).sum() / len(sem))
print("文法的アナロジー正解率:", (syn[4] == syn[5]).sum() / len(syn))
今回の課題は割とシンプル。
データを読み込んで、意味的アナロジーのデータと文法的アナロジーのデータに分割します。
読み込んでいるデータをどのように生成しているかは「言語処理100本ノック2020年版を解いてみた【第7章:単語ベクトル 64】」をご覧ください。
意味的アナロジー | capital-common-countries, capital-world, currency, city-in-state, family |
文法的アナロジー | gram1-adjective-to-adverb, gram2-opposite, gram3-comparative, gram4-superlative, gram5-present-participle, gram6-nationality-adjective, gram7-past-tense, gram8-plural, gram9-plural-verbs |
意味的アナロジーにはgram
という文字列が含まれているカテゴリーがないので、gram
が含まれていないデータを抽出しています。
文法的アナロジーはgram
という文字列が含まれているデータのみを抽出しています。
カテゴリ情報はデータの1列目なので、df[0]
を指定しています。
あとは正解率を算出するだけです。
正解率は、5列目と6列目が一致しているものをデータ数で割ることで算出しています。
5列目と6列目が一致している数は、==
で比較して、sum()
メソッドでTrue
の数を集計しています。
まとめ:pandasだとデータの抽出が楽
今回は第7章:単語ベクトルの「65. アナロジータスクでの正解率」を解いてみました。
pandasだとデータの抽出が割と簡単にかけるので楽ですね…!
pandasを使わずにやろうとすると、内包表記にif文を含めて書いたり、ループを回して条件に合致するか確認したりなどする必要があるかと思います。
言語処理のみならず、データ処理についても学べるので一石二鳥ですね。
「ここはもっとこういう書き方がいいですよ!」「これはアンチパターンですよ!」など、言いたいことがある方はぜひコメントいただければと思います。
引き続きよろしくお願いします!