{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 係り受けを用いた目的語抽出+ネットワーク描画の例\n", "自然言語処理における代表的な情報抽出には、(1) 表面的な文字そのものを指定する方法、(2) 品詞を指定する方法、(3) 係り受け関係を指定する方法、(4) 分散表現による距離を参照する方法がある。\n", "\n", "ここでは係り受け関係の例として「目的語 => 係り受け先」という関係を抽出してみよう。例えば「例題を取り入れて理解しやすくしてほしい。」という文においては「例題 => 取り入れ」がこの関係に相当する。この例では「例題」が目的語(UDではtoken.dep_ == obj)となり、「取り入れ」が係り受け先(UDではtoken.head)に相当する。\n", "\n", "- NOTE\n", " - ネットワーク描画のために networkx, pyviz を利用している。これらは pip install でインストール可能。\n", " - networkx はネットワーク描画や分析等に使われるライブラリ。本来ならこれだけで済むことが多いが、日本語には未対応のため pyviz (グラフ描画ライブラリ)も利用している。\n", " - pyviz注意点。\n", " - Google Colab ではやや取り扱いに難がある。具体的には pip install 後に一旦カーネルに再接続し直す必要がある。\n", " - Pythonスクリプトとして実行するか、ノートブック(ipynb)として実行するかによりコードがやや異なる。具体的にはコード内コメントを参照。\n", "- 参考\n", " - [Universal Dependency Relations](https://universaldependencies.org/u/dep/)\n", " - [日本語の構文解析における3つの「係り受け」](http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/kakariuke.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 利用ライブラリの用意、データセット準備\n", "事前に、[load_r_assesment.ipynb](./load_r_assesment.ipynb) でデータセットを作成し、pkl形式でファイル保存(r_assesment.pkl)しておく。今回は作成済みファイルをダウンロードして利用することにする。\n", "\n", "r_assesment.pklは授業評価アンケートの自由記述欄をpd.DataFrame形式で保存したもので、授業名(title)、学年(grade)、必修か否か(required)、質問番号(q_id)、コメント(comment)で構成される。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 34834 100 34834 0 0 71686 0 --:--:-- --:--:-- --:--:-- 72722\n" ] } ], "source": [ "!curl -O https://ie.u-ryukyu.ac.jp/~tnal/2022/dm/static/r_assesment.pkl" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | title | \n", "grade | \n", "required | \n", "q_id | \n", "comment | \n", "
---|---|---|---|---|---|
0 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (1) | \n", "特になし | \n", "
1 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "正直わかりずらい。むだに間があるし。 | \n", "
2 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "例題を取り入れて理解しやすくしてほしい。 | \n", "
3 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "特になし | \n", "
4 | \n", "工業数学Ⅰ | \n", "1 | \n", "True | \n", "Q21 (2) | \n", "スライドに書く文字をもう少しわかりやすくして欲しいです。 | \n", "
\n", " | from | \n", "to | \n", "weight | \n", "
---|---|---|---|
0 | \n", "例題 | \n", "取り入れる | \n", "1 | \n", "
1 | \n", "文字 | \n", "する | \n", "1 | \n", "
2 | \n", "行列 | \n", "扱う | \n", "1 | \n", "
3 | \n", "演習 | \n", "出す | \n", "1 | \n", "
4 | \n", "時間 | \n", "おく | \n", "1 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "
146 | \n", "報告会 | \n", "行う | \n", "1 | \n", "
147 | \n", "javascript | \n", "用いる | \n", "1 | \n", "
148 | \n", "アプリケーション | \n", "開発 | \n", "1 | \n", "
149 | \n", "コーディング | \n", "教える | \n", "1 | \n", "
150 | \n", "フレームワーク | \n", "試す | \n", "1 | \n", "
151 rows × 3 columns
\n", "