文書判別を行う

本ガイドでは、テキスト分析 AAPFアドオンの文書判別機能を用いた分析例を示します。

文書判別機能は、機械学習の手法を使って、未知の文書を決められたカテゴリに分類する機能です。
例えば、地域住民の活動に関する雑多な文書の中から、どのような「防災の取り組み」が行われているかを自治体が調査する場合、それを人手で調査するには多大な時間と労力がかかる可能性があります。

今回は、テキスト分析 AAPFアドオンの文書判別機能を使って、文書が「防災」に関する文書かそうではないかを自動で判別するシナリオを示します。

文書判別機能の分析手順は下記のとおりです。

  1. 設定ファイル準備
  2. データ確認
  3. モデル作成
  4. 文書判別結果確認

モデル作成と文書判別は以下の入出力・処理になります。

モデル作成

  • 処理: 正解データを用いて判別モデルを作成する。
  • 入力: 以下の項目からなる文書の集合(正解データ)
    • 文書ID
    • 判別対象のテキスト
    • 判別結果のカテゴリが付与された正解情報
  • 出力: 学習結果の判別モデル

文書判別

  • 処理: 判別モデルを用いて文書を決めれたカテゴリに分類する
  • 入力: 以下の項目からなる判別対象の文書の集合(判別対象データ)
    • 文書ID
    • 判別対象のテキスト
  • 出力: 判別結果
    • 文書ID
    • 判別結果

データを準備する

文書判別機能を動かすための設定ファイルを準備します。

  1. ユーザがアクセス可能なディレクトリにdester-python-getting_started-1.2.0_3.zipを格納します。

  2. 格納したファイルを解凍します。

    $ unzip dester-python-getting_started-1.2.0_3.zip
    
  3. ディレクトリを移動します。

    $ cd dester-python-getting_started-1.2.0_3
    

分析を実行する

1. 設定ファイル準備

判別機能を動かすための設定ファイルを作成します。 DATA_DIR_PATH、OUTPUT_DIR_PATHには データを準備する で解凍した設定ファイルのパスを指定して下さい。

以下では、 データを準備する で解凍したディレクトリと、ipynbファイルが同じディレクトリにある場合の例を示しています。

In [1]:

import os
import jinja2

# 設定ファイルに記述するパスは実行パスに依存するため、絶対パスで指定します。

# 実行パス、データ格納ディレクトリを絶対パスで取得します。
CUR_DIR_PATH = os.path.abspath(os.path.curdir)
DATA_DIR_PATH = os.path.join(CUR_DIR_PATH, 'examples/classification/data')
OUTPUT_DIR_PATH = os.path.join(CUR_DIR_PATH, 'examples/classification/output')

# 設定ファイルのひな形と出力先のパスを指定します。
template_path = os.path.join(DATA_DIR_PATH, 'classification_tmpl.conf.j2')
output_conf_path = os.path.join(DATA_DIR_PATH, 'classification.conf')

# 結果ファイルのパスを指定します(Notebookと同じパスのoutput以下に出力します)。
write_csv_path = os.path.join(OUTPUT_DIR_PATH, 'output.csv')
model_path = os.path.join(OUTPUT_DIR_PATH, 'model')

# 辞書ファイルのパスを設定します。
stopword_dic_path = os.path.join(DATA_DIR_PATH, 'dic/stopword.lprk.dic')
addspan_dic_path = os.path.join(DATA_DIR_PATH, 'dic/addspan.l.dic')

# 設定ファイルのパラメータをdict型に格納します。
file_path_data = {
    'write_csv_path': write_csv_path,
    'model_path': model_path,
    'addspan_dic_path': addspan_dic_path,
    'stopword_dic_path': stopword_dic_path
}

# 設定ファイルを生成します。
env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'))
tmpl = env.get_template(template_path)
data_config = tmpl.render(file_path_data)
with open(output_conf_path, 'w', encoding='utf-8') as f:
    f.write(data_config)

2. データ確認

学習で用いる正解データの上から5件を表示します。

In [2]:

import pandas as pd

train_data_path = os.path.join(DATA_DIR_PATH, 'classification_train_data.csv')
train_data = pd.read_csv(train_data_path, index_col=0)
train_data[['TEXT', 'DOCCLS']].head(5)
ID TEXT DOCCLS
1 地震、津波、台風など自然災害は思わぬときにやってきます。災害をなくすことはできませんが、被害… Bousai
2 内閣府では、災害被害を軽減するための取組みを展開しており、一人ひとりが日頃から具体的な行動(… Bousai
3 災害に対する安全・安心を確保するためには、行政による「公助」を充実させていくことはもとより、… Bousai
4 子ども・子育て支援新制度では、教育・保育施設を対象とする施設型給付・委託費に加え、以下の保育… NotBousai
5 都市部では、認定こども園等を連携施設として、小規模保育等を増やすことによって、待機児童の解消… NotBousai

データは以下のフォーマットになっています。

  • ID : 文書ID

  • TEXT : 文書の本文(解析対象の文字列)

  • DOCCLS : 正解情報(Bousai:正例、NotBousai:負例)

    Note

    正例、負例に割り当てる文字列(Bousai、NotBousai)は設定ファイルで指定しています。

判別実行で用いる判別対象データの上から5件を表示します。

In [3]:

test_data_path = os.path.join(DATA_DIR_PATH, 'classification_test_data.csv')
test_data = pd.read_csv(test_data_path, index_col=0)
test_data[['TEXT']].head(5)
ID TEXT
1 商店に対して「防災アンケート」を実施し、商店主の防災意識を把握し、商店が持つべき防災上の役割…
2 地域で防災活動が展開されるにあたっては、リーダーやキーマン自身が防災に関心を持つことが有効で…
3 本事業では、防災講演会やワークショップ、防災訓練といった「行事」の開催や、防災に関する気運の…
4 これは、結婚・妊娠・出産・育児の切れ目ない支援を行うため、地域の実情に応じて地域独自の先駆的…
5 少子化対策における目標の設定については、施策の効果検証や国民の意識改革の観点から必要である。…

3. モデル作成

学習で用いる正解データを使用して判別モデルを作成します。

In [4]:

import dester_python

execType = 'dester-classify-training'
inputPath = os.path.join(DATA_DIR_PATH, 'classification_train_data.csv')
configPath = output_conf_path
dester_python.exec_dester_cmd(execType, inputPath, configPath)
DI000001 Command has been started.
DI000002 Command was successful.

4. 判別結果確認

作成したモデルを使用して判別対象データの判別を行い、結果をcsvファイルに出力します。

In [5]:

import numpy as np

# 文書判別を実行します。
execType = 'dester-classify-csv-csv'
inputPath = os.path.join(DATA_DIR_PATH, 'classification_test_data.csv')
configPath = output_conf_path
dester_python.exec_dester_cmd(execType, inputPath, configPath)

# 判別結果を読み込み、結果を整形して表示します。
classify_result = pd.read_csv(write_csv_path)
classify_result.rename(columns={'id': 'ID', 'text': 'TEXT', 'DocCls': '判別結果'}, inplace=True)
classify_result.set_index('ID', inplace=True)
classify_result.loc[classify_result['判別結果'].notnull(), '判別結果'] = 'Bousai'
classify_result.loc[classify_result['判別結果'].isnull(), '判別結果'] = 'NotBousai'
classify_result[['TEXT', '判別結果']].style.set_properties(**{'text-align': 'left'})
DI000001 Command has been started.
DI000002 Command was successful.
ID TEXT 判別結果
1 商店に対して「防災アンケート」を実施し、商店主の防災意識を把握し、商店が持つべき防災上の役割を検討すること Bousai
2 地域で防災活動が展開されるにあたっては、リーダーやキーマン自身が防災に関心を持つことが有効です。リーダーやキーマンは、自身が属するコミュニティに限らず、多種多様な話題、地域に対しても関心を持ち、自分の地域の課題や解決へ向けた道筋を知る努力が必要です。 Bousai
3 本事業では、防災講演会やワークショップ、防災訓練といった「行事」の開催や、防災に関する気運の向上への「今後の取り組みの合意形成」など、「きっかけ」を様々な形で実現しました。 Bousai
4 これは、結婚・妊娠・出産・育児の切れ目ない支援を行うため、地域の実情に応じて地域独自の先駆的な取組を行う都道府県及び市区町村を国が支援することを目的とするものである。 NotBousai
5 少子化対策における目標の設定については、施策の効果検証や国民の意識改革の観点から必要である。個々人が希望する年齢に結婚でき、かつ、希望する子どもの数と生まれる子どもの数との乖離をなくしていくための環境整備は、国民の理解や賛同が得られるものとして目標の一つとなり得る NotBousai
6 社会見学で訪れた小学生が商店主へ防災インタビューを行い、子どもと商店街の世代間のふれあいを築くこと Bousai
7 地区内で、様々な人々が連携した防災活動を実施するには、意識の醸成を含めて相当な時間がかかると見据え、今後、段階別の取り組みを構築して行く必要があると判断して、「ロードマップ」を作成しました。今後は、「ロードマップ」に沿って着実に取り組みが進むことが期待されます。 Bousai
8 施策の効果検証や国民の意識改革の観点から何らかの目標設定は必要 NotBousai
9 政府全体で取り組む総合的な指針として、新しい少子化社会対策の大綱の策定に向けた検討に早期に着手 NotBousai
10 町会長は、地区住民に対して回数を重ねながら活動の重要性を説き、「きっかけ」を実践することに対して、地区全体として円滑な熟度の形成を図ることができました。 Bousai
11 講演会参加者でワークショップを行い、地域全体で防災活動に取り組む必要性の合意を得ること Bousai
12 新潟県中越沖地震で被災し、中心市街地の復興に取り組んでいる被災体験者を招き、地区関係者を集めて講演会を行い、災害時や復興の学習をすること Bousai
13 少子化対策に集中的に取り組む期間の設定とともに、「CAPD」サイクルを回す仕組みの構築を目指す。また、従来の子育て支援を中心とした少子化対策のみならず、関連政策との連携など、施策を総動員した、政府内に戦略本部を置くなど政府を挙げた抜本的な少子化対策を目指す。あわせて、まずは現在の対GDP比約1%の倍に当たる対GDP比2%を目指す。 NotBousai
14 地域やコミュニティで重要な役割を担うリーダー、キーマンは、情報伝達や指揮命令等において一定の影響力を持っており、地域が連携・結束して活動を展開する際には重要な存在です。 Bousai
15 町会長が中心となって地区内の全ての動き(他のお祭り等の行事日程等)を調整することにより、準備を円滑に進め、様々な世代が参加できる形を企画しました。 Bousai
16 ・「きっかけ」として企画した「里川町防災訓練」は、地区にとって初めての防災活動でした。リーダーである町会長は、地区内で暮らすお年寄り、女性、子ども等に対する防災上の様々な課題について、以前から問題意識を持っていました。 Bousai
17 このため、「次に何をする必要があるか」を考え、継続への工夫を事前に意識しておくことが重要です。 Bousai
18 しかし、「行事」を実施した場合、地域住民にとってはイベントを開催した達成感で満足し、今後継続して活動することが難しくなる恐れがあります。 Bousai
19 アンケートをもとに、各商店が災害発生時に支援・救援できることを記載した「防災マップ」を作成して地域住民にPR すること Bousai
20 目標の設定に当たっては、国民全体、また家族に関わるものであることに留意し、国民の理解と賛同を得られ、子どもの最善の利益を追求するものとなるよう十分な配慮が重要 NotBousai

防災に関する文書は「Bousai」に、防災に関する文書ではないもの(少子化に関する文書)は「NotBousai」と判別されています。