自然言語処理とそのデータ前処理の概要

# はじめに

機械学習のシステム化に際して、データの前処理に要する時間やリソースを考慮し、設計に活かすノウハウが求められています。
今回は、自然言語を対象としたデータ前処理の概要と、感情極性分析の実装例である[chABSA-dataset](https://github.com/chakki-works/chABSA-dataset)におけるデータ前処理を題材とした性能検証結果を紹介します。

投稿一覧
1. 自然言語処理とそのデータ前処理の概要 ... 本投稿
2. 自然言語処理におけるデータ前処理の性能検証

本投稿の目次は以下です。

- [1. 自然言語処理とそのデータ前処理](#1-自然言語処理とそのデータ前処理)
	 - [1.1 自然言語処理とは](#11-自然言語処理とは)
	 - [1.2 機械学習システムにおける自然言語処理のデータ前処理とは](#12-機械学習システムにおける自然言語処理のデータ前処理とは)
- [2. 感情極性分析の前処理を題材とした前処理の例](#2-感情極性分析の前処理を題材とした前処理の例)
	 - [2.1 自然言語処理のユースケース選定](#21-自然言語処理のユースケース選定)
	 - [2.2 取り扱う前処理の概要](#22-取り扱う前処理の概要)
	 - [2.3 データ量見積もり](#23-データ量見積もり)
	 - [2.4 前処理のためのOSS選定](#24-前処理のための-oss-選定)
	 	 - [2.4.1 分かち書き(単語分割)について](#241-分かち書き単語分割について)
	 	 - [2.4.2 ベクトル化について](#242-ベクトル化について)
	 	 - [2.4.3 それ以外のステップについて](#243-それ以外のステップについて)
- [まとめ](#まとめ)

# 1. 自然言語処理とそのデータ前処理

## 1.1 自然言語処理とは

人間が意思疎通を行うために日常的に利用している日本語や英語のような、自然に発展してきた言語を自然言語と言います。プログラミング言語のような人工的な言語とは異なり、自然言語は文の意味や解釈が一意に決まらないような曖昧性があります。

自然言語処理とは、自然言語を使って書かれた膨大なテキストデータを、言葉の曖昧性を踏まえてコンピュータが実用的に扱うことを可能にすること、もしくはそのための技術を指します。
自然言語処理の応用例には、スマートスピーカー、Web検索エンジン、機械翻訳、日本語入力システム、感情極性分析などが挙げられます。


## 1.2 機械学習システムにおける自然言語処理のデータ前処理とは

画像データ(ピクセル値の集合)や、各種センサーから取得できる時系列データは数値として表現できるデータです。一方で自然言語とは単語の集合であり、そのままでは数値として扱うことはできません。

データから法則性を抽出する統計的手法である機械学習で自然言語を扱うためには、何らかの形で自然言語を数値データに変換する必要があります。この変換のことをベクトル化、ベクトル化によって得られた数値データとしての表現のことを特徴量と呼びます。

自然言語処理における前処理とは、テキストデータである自然言語から数値データである特徴量への変換(ベクトル化)、およびその前に実施されるノイズの除去や単語列への分解などの処理を指します。自然言語処理分野の前処理の流れを表1に示します。

表1 自然言語処理分野の前処理とデータ状態の遷移

| データの状態 | 処理分類 | 説明 |
| :-: | :-: | :-- |
| 生データ | - | |
|  ↓  | クリーニング | 分析対象としたいテキストデータに付随する HTML タグなどのテキスト以外の不要データを除去 |
| 文章 | - | |
|  ↓  | 分かち書き | 文章を品詞ごとに分解し、単語の配列とし(単語分割) て分割 |
| 単語列 | - | |
| ↓ | 正規化、ストップワード除去 | 表記ゆれの統一、分析をする上で無意味な単語の除去 |
| 分析に必要な単語列 | - | |
|  ↓ | ベクトル化 | 単語列から数値データへ変換
| 特徴量ベクトル |  - | |

#2. 感情極性分析の前処理を題材とした前処理の例

## 2.1 自然言語処理のユースケース選定
自然言語処理のユースケースの一つに、あるテキストが示す内容の良し悪しを判定し、意思決定支援として活用する感情極性分析があります。例えば、B2C ビジネスにおける SNS 上での自社製品の評判分析や、金融ビジネス向けにおける企業の業績情報を元にした融資・投資の妥当性分析など幅広い分野において活用が見込まれます。

本投稿では、広い業種において採用可能性のある感情極性分析に注目し、インターネット上に公開されている感情極性分析の Python 実装例である chABSA-dataset を題材として以降の説明を実施します。

## 2.2 取り扱う前処理の概要
chABSA-dataset では、[EDINET](https://disclosure.edinet-fsa.go.jp/) にて公開されている 2016 年度の有価証券報告書データ (XBRL形式 [^1] /2,260 企業/約 7.9GB) を生データとして扱います。このデータ中の業績等を説明する文章からポジティブ/ネガティブという感情極性情報を抽出するために、サポートベクタマシン(SVM)を用いた教師あり学習モデルを作成します。chABSA-dataset の処理は大きく 3 つに分けられます。

[^1]: XBRL形式のデータは、企業が公表する有価証券報告書のHTML形式データの外側にメタデータを付与するようにXMLの入れ子構造になっている。

(1) ポジティブ/ネガティブの判定を実施するモデルをつくるための訓練データを作成するためのアノテーション処理
(2) (1)で作成したデータに基づいたモデル作成(学習)処理
(3) (2)で作成したモデルを利用した感情極性分析処理

自然言語処理分野のデータ前処理は、(1)の処理および(2)の処理の前半(モデル作成の手前まで)に含まれています。(1)の処理および(2)の処理に含まれるデータ前処理を、表2 に示します。


表2 chABSA-datasetにおけるデータ前処理

| データの状態 | 処理分類 | 説明 |
| :-: | :-: | :-- |
| 生データ(XBRL形式) | - | |
|  ↓  | クリーニング | XML の一種である Xbrl 形式の生データ から、有価証券報告書の業績を表す セクションの HTML データを抽出する |
|文章(HTML形式) | - | |
|  ↓  | クリーニング | HTML タグの除去 |
| 文章 | - | |
|  ↓  | 分かち書き | 文章を単語列に分解 |
| 単語列 | - | |
| ↓ | 正規化、ストップワード除去 | ・数値を 0 に置換 ・空白文字を除去 |
| 分析に必要な単語列 | - | |
|  ↓ | ベクトル化 | 単語列から数値データへ変換
| 特徴量ベクトル |  - | |



## 2.3 データ量見積もり

機械学習においては処理対象のデータ量が多いほど、処理および学習処理の処理時間や必要となるリソース量は多くなります。そのため、入力する生データ量を事前に見積もることが必要となります。

chABSA-dataset における生データである有価証券報告書(2016 年度)の内容・文量は企業毎に異なります。EDINET にて公開されている XBRL形式の有価証券報告書は企業毎にデータファイルが分けられており、1 企業のデータファイルは 10MB 以内でした。chABSA-dataset では全 2,260 企業データ、合計すると約 7.9GB のデータを扱います。

ここで、表2 に示した処理の内容を参照すると、次の 2つのことがわかります。

まず、企業データファイル毎に処理を個別に逐次実施することが可能であり、全企業のデータを一度に処理できる必要はありません。次に、ある企業のデータファイルの前処理結果が他の企業データファイルの処理結果に影響を与えることがありません。そのため、処理順序を考慮することなくバラバラに処理することが可能です。

これらのことから、全データを一度にメモリ上にロードできるような大容量メモリのサーバは必要ではないこと、リソースが許す範囲で並列処理/分散処理の仕組みを適用すれば高速化が可能であることがわかります。

## 2.4 前処理のための OSS 選定

自然言語処理の前処理において、特徴的なステップは分かち書き(扱う言語が日本語の場合)とベクトル化です。これらの処理に関して個別に OSS 選定の例を挙げます。

### 2.4.1 分かち書き(単語分割)について

代表的な分かち書き用ライブラリ(形態素解析器)を表3 に示します。それぞれのライブラリによって内部実装や開発言語に違いがありますが、できることは大きく変わりません。

表3 主要な分かち書き用ライブラリ(形態素解析器)

| # | ライブラリ名 | 説明 |
| :-: | :-: | :--  |
| 1 | MeCab | 日本語形態素解析器の主流。IPA コーパスに基づいた日本語辞書が同時公開されている。C++での実装により高速に動作する |
| 2 | Janome | Python のみで実装された辞書内包型形態素解析器。Python プログラマが使いやすいことを目指して設計されている |
| ~~3~~ | ~~CaboCha~~ | SVM を利用した~~形態素解析器~~ 係り受け解析器。依存ソフトにMeCabがあり、形態素解析した結果を利用します(※ 2020年8月18日 訂正)。日本語辞書は自前で用意する必要があり、データの権利を考慮しながらの開発を必要とする |

※ コメントにてCaboChaは「形態素解析器」ではなく「係り受け解析器」だと指摘をいただきました。混乱を招いてしまい申し訳ありません。お詫びして訂正いたします。

chABSA-dataset において Janome が利用されているように、データサイエンティストがモデル開発の前処理時点で、開発環境への導入の簡易性などの理由から Janome や他の分かち書きライブラリを利用することもあります。

モデルと合わせて前処理のプログラムもデータサイエンティストから受け取るような場合には、辞書データのライセンスや性能に注意しながらライブラリを変更する必要があるかもしれません。

後日アップする「自然言語処理におけるデータ前処理の性能検証」では、 Janome によって書かれた分かち書き処理を、MeCab を使って置換した場合の変更点のポイントと、性能の差を示します。

### 2.4.2 ベクトル化について

特徴量ベクトルの表現方法はモデルの作り方に大きく依存しています。したがって、基本的にはデータサイエンティストによるベクトル化手法をコードで再現することになるので、推奨するライブラリ等は特にありません。

近年のベクトル化は「単語の意味は周囲の単語によって形成される」という分布仮説に基づくものがほとんどです。その中で、出現頻度でベクトルを作成する「カウントベースな手法」や、単語の並び情報から当てはまる単語を推論するための重みベクトルを活用する「推論ベースの手法」が存在します。
chABSA-dataset では前者の手法が採用されています。後者の手法で代表的なものが Word2vec です。


### 2.4.3 それ以外のステップについて

分かち書きとベクトル化のステップ以外の処理、例えばクリーニング処理や正規化処理は、XML などのデータ形式依存の解析もしくは文字列の置換によって実施されるものがほとんどです。

このとき必要となる機能は、データ形式依存の解析機能やプログラミング言語に標準的に備わっている正規表現処理機能です。したがって、これらのステップにおいても、推奨するライブラリは特にありません。


# まとめ
- 本投稿では自然言語処理とはなにか、どのような前処理があるのかを概説しました。
- 自然言語処理の中の感情極性分析に焦点をあて、実装例のchABSA-datasetを題材に前処理の実例を説明しました。