🐱

自然言語処理におけるデータクレンジングの重要性について

2023/07/06に公開

はじめに

こんにちは。D2C データサイエンティストの仲山です。

本記事では、自然言語処理におけるデータクレンジングの重要性について考えてみたいと思います。

データクレンジングとは、その名の通りデータを綺麗にすることです。
例として以下のような処理が該当します。

  • 不要な文字や記号、絵文字を排除する
  • 半角文字と全角文字が混在している場合はどちらかに統一する

分析に使用するデータは、自然言語処理に限らず綺麗な方が良いので、データクレンジングは行った方が良いということは理解ができます。
ただ、実際にデータクレンジングをするとしないで、分析結果にどの程度の影響があるのか気になったので、今回は「文同士の類似度を計算する」処理を通して、データクレンジングの影響について考えたいと思います。

検証

以下の3つの文A〜Cを類似度計算の対象とします。
文A「今日もネコが可愛い!!」
文B「飼っているネコ🐱が可愛い〜」
文C「ラジオを聴くことが日課だ!!🐱」

これらの文はデータクレンジングを行う前の状態を想定して作成しました。
そのため絵文字や記号のようなノイズとなる情報が含まれていたり、半角文字と全角文字が混在していたりする状態になっています。
データクレンジングは行っていないものの、それぞれの文の内容から文AとBは似ている、文Cは文A、Bどちらともあまり似ていない、といったことが感覚的にわかるかと思います。

これらの文同士の類似度を計算するにあたり、今回は以下の流れで計算を行います。

  1. 形態素解析
  2. ベクトル化(Bag-of-Words)
  3. 文の類似度を計算(コサイン類似度)

形態素解析

形態素解析とは、文を言語が意味を持つ最小単位(≒単語)まで分解することです。
文A〜Cに対して形態素解析を行うと以下の図のようになります。

※ わかりやすいように形態素解析によって分解した単語と単語の間にスラッシュ(/)を入れています。
今回はmecab-ipadic-NEologdという、MeCab用の辞書を使用して形態素解析を行いました。

ベクトル化

形態素解析を実施した後の文を用いて、文をベクトルで表現できるようにします。
ベクトルで表現できるようになることで、この後の類似度計算の処理が可能になります。
ベクトル化にはBag-of-Words(BoW)という手法を使用します。
BoWでは各単語が文中に出現する回数を用いてベクトル化する手法です。
BoWを用いてベクトル化を行うと以下の図のようになります。

図のように、文中に出現している単語であればその出現回数を、文中に出現していない単語であれば0を入れます。

類似度計算

最後にBoWで得たベクトルを用いて、文同士の類似度を計算します。
類似度計算にはコサイン類似度を使用します。
コサイン類似度は、2つのベクトルがどのくらい似ているのかを表現する手法です。
コサイン類似度は-1から1までの値をとり、2つのベクトルが同じ向きだと1に近い値になり、逆向きだと-1に近い値になります。
今回の場合、比較対象の文について、文を構成している単語が同じであるほど、BoWで得るベクトルは似たベクトルになり、コサイン類似度は1に近くなります。
そのため、文A〜Cそれぞれの組み合わせでコサイン類似度を計算し、その値が1に最も近い組み合わせが、最も類似している文の組み合わせになります。

BoWで得たベクトルを用いて計算した、文A〜Cそれぞれの組み合わせのコサイン類似度は以下の通りです。

コサイン類似度 データクレンジング前
文AとB 0.13
文BとC 0.22
文AとC 0.48

コサイン類似度を用いて判断するのであれば、文A「今日もネコが可愛い!!」と文C「ラジオを聴くことが日課だ!!🐱」が最も類似している組み合わせであり、文A「今日もネコが可愛い!!」と文B「飼っているネコ🐱が可愛い〜」が最も類似していないということになります。
同じ「猫の可愛さ」について記載している文AとBが最も類似度が低いのは、なんとなく疑問を感じてしまいます。

データクレンジング

次にデータクレンジングを実施した文A〜Cに対して同様の手順で文同士の類似度を計算してみます。
データクレンジングとして今回は下記の処理を実施しました。

  • 記号(!,〜)と絵文字(🐱)の排除
  • 半角文字を全角文字に変換(ネコ → ネコ)

データクレンジング実施後の文A〜Cは以下のようになります。
文A「今日もネコが可愛い」
文B「飼っているネコが可愛い」
文C「ラジオを聴くことが日課だ」

この文に対して形態素解析を行います。

次にBoWを用いてベクトル化します。

最後にベクトル化した文A〜Cについてコサイン類似度を計算します。

コサイン類似度 データクレンジング未実施 データクレンジング実施
文AとB 0.13 0.55
文BとC 0.22 0.15
文AとC 0.48 0.17

今度は文A「今日もネコが可愛い」と文B「飼っているネコが可愛い」の組み合わせのコサイン類似度が最も高くなりました。

検証結果 まとめ

今回はデータクレンジング処理の有無で、類似度計算の結果にどのような違いが発生するか検証しました。
結果として、データクレンジングの有無で最も類似度が高い文の組み合わせに違いが見られました。

データクレンジングを実施した文を用いたコサイン類似度の方が納得度の高い結果になったかと思います。

データクレンジングの有無でコサイン類似度に違いが見られた要因としては以下が考えられます。

  1. 記号や絵文字のようなノイズとなる情報が含まれていたこと
    • 比較対象の文中に共通で出現している記号や絵文字などの不要な情報(!や🐱)により、文AとCの組み合わせや文BとCの組み合わせで、コサイン類似度の値が高くなってしまったことが考えられます。
    • データクレンジング前の文Bの形態素解析では、「可愛い」と「〜」が分解されず「可愛い〜」が一つの形態素とされています。そのため文Aに含まれる「可愛い」と文Bに含まれる「可愛い〜」は異なる単語としてベクトル化されています。使用する形態素解析器によってどのように分解されるか変化することがありますが、ノイズとなる情報を事前に排除しておけば今回の事象は防ぐことができます。
  2. 半角文字と全角文字が統一化されていないままだったこと
    • 文Aと文Bそれぞれに含まれる「ネコ / ネコ」は、半角文字と全角文字が統一されていないため、それぞれが異なる単語としてベクトル化されています。

おわりに

今回の検証結果から適切なデータクレンジング処理を行わないと、想定の分析結果を得られない可能性があることがわかりました。
データによって、必要になる前処理も変わります。例えば、何らかのサービスに対するアンケートの自由記述回答やレビューなどのテキストデータを扱う場合は、記号や絵文字などの排除に加えて、誤字脱字の修正も必要になります。
また、ウェブから取得したテキストデータを扱う場合は、HTMLタグの削除などが必要になります。

自然言語処理に限った話ではありませんが、まず分析対象のテキストデータをしっかりと確認し、適切なデータクレンジング処理を行う重要性がわかりました。

参考

https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
https://atmarkit.itmedia.co.jp/ait/articles/2112/08/news020.html#:~:text=用語「コサイン類似度」について,に使われている。

D2C m-tech

Discussion