Translate

2023年7月16日

Goolge Colabでお手軽テキストマイニング(日本語前処理)

象と散歩:pythonで遊ぶ 

Google Colaboratory は、Google アカウントさえ持っていれば、Python を実行できる素晴らしい環境です。準備やインストールが不要で、手軽に Pythonプログラミングを楽しめます。

テキストデータの分析(アンケートのフリーコメントや問い合わせ内容など)も、Google Colaboratory の環境を使えば、手軽にPythonでテキストマイニングができます。

今回は、テキストの前処理に関する2つのステップについて説明します。

  1. テキストの読み込み テキストファイル、CSV、Excel ファイルなどに保存されたテキストデータを読み込む方法です
  2. 読み込んだテキストの正規化 テキストの表記の揺れを少なくして文章を分析しやすい形式に変換します

1. 対象ファイルを読み込む

3つの方法でテキストデータを読み込む方法について説明します。2番目と3番目の方法では、pandasパッケージを使用します。

  1. テキストファイルの読み込み テキストファイルの中にあるテキストデータを読み込む方法です。open()関数を使用してファイルを開き、ファイルの中身をテキストデータとして抽出します。
  2. CSVファイルの読み込み CSVファイルに格納されたテキストデータを読み込む方法です。pandasパッケージのread_csv()関数を使用します。この関数にはCSVファイルのパスを指定し、データをデータフレームとして読み込むことができます。
  3. Excelファイルの読み込み Excelファイルに格納されたテキストデータを読み込む方法です。pandasパッケージのread_excel()関数を使用します。この関数にはExcelファイルのパスを指定し、データをデータフレームとして読み込むことができます。

ファイルのアップロード

Google Colaboratory ではGoogleドライブをマウントして利用することもできますが、下例は、ファイルをセッションストレージ(セッションが接続されている間だけ使えるストレージ)の "/content/sample_data" にアップロードする方法です。

  1. Colabの左端にあるファイルアイコンをクリック(下図オレンジ枠)
  2. sample_dataフォルダを開く
  3. セッションストレージにアップロード(下図グリーン枠)

ドラッグアンドドロップでもアップロードできます。

Google Colaboratory:ファイルのアップロード

アップロードするsample.txtの内容は下記のようなものです。

<sample.txt>
甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

エンコーディング

テキストデータを読み込む際には、エンコード(Encoding)を指定する必要があります。エンコードは、テキストデータのバイト列(バイナリデータ)への変換方法や規則を指定するものです。日本語などの2バイト文字データを正しく扱うためには、適切なエンコードを指定する必要があります。

一般的なエンコーディングとしては、以下のようなものがあります。

  • UTF-8: 広く使用されるUnicodeエンコーディングで、多くのプラットフォームやシステムでサポートされています。MacやLinux環境でよく使われます。
  • Shift-JIS: 主にWindows環境で使われる日本語エンコーディングです。

下例は、/content/sample_data/にあるsample.txtを読み込むコードです。file_pathに読み込むテキストをフルパスで指定しています。パスは当該フォルダを右クリックして"パスをコピー"で取得できます。

Google Colaboratory:ファイルパスの取得

UTF-8のファイルを指定する場合です。変数 textに読み込んだ内容を格納します。

file_path = '/content/sample_data/sample.txt'
with open(file_path, 'r', encoding='utf-8') as file:
    text = file.read()

print(text)

Shift-JISの場合は下記のようになります。

file_path = '/content/sample_data/sample.txt'
with open(file_path, 'r', encoding='shift_jis') as file:
    text = file.read()

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

エンコードがわからない場合

chardetは、Pythonで利用できるエンコーディング推定ライブラリです。テキストのエンコードがわからない場合は、chardetでエンコードを確認してファイルを読み込みます。

下例では、sample.txtを読み込んで何のエンコードかを調べた結果をfle_encordingに格納し、そのエンコーディングでファイルを再度読み込みます。

import chardet

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.txt'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

print(file_encording) #エンコード情報

# 取得したエンコーディング情報でファイルを読み込む
with open(file_path, 'r', encoding=file_encording) as f:
    text = f.read()

print(text)

CSVからの読み込み

CSV(カンマ区切り)の場合は、pandasのread_csv()関数を使って列名を指定してデータを読み込みます。

読み込むcsvは、1列目の列名が「no.」、2列目の列名が「回答」です。

<sample.csv>
no.,回答
1,甘くてフルーティーな味で最高
2,チョコレートとストロベリーの組み合わせが最高!
3,香りが良くて食べやすい!おすすめです。
4,子供たちも大喜びのおいしさ!リピート決定。
5,さわやかな酸味と濃厚なチョコのバランスが絶妙。

下例は、上記のCSVファイルのうち列名が「回答」となっている列を取得するコードです。改行区切りで変数 textに格納します。

import chardet
import pandas as pd

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.csv'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# CSVファイルを読み込んでテキストデータを抽出
df = pd.read_csv(file_path, encoding=file_encording)
text = '\n'.join(df["回答"])  # 回答列名を適宜変更してください

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

Excelから読み込む場合

Excelファイルから直接読み込むことも可能です。pandasのread_excel()関数を使います。シート名と列名の指定が必要です。

import chardet
import pandas as pd

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.xlsx'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# Excelファイルを読み込んでテキストデータを抽出
sheet_name = 'シート1'  # 読み込むシートの名前を指定してください
df = pd.read_excel(file_path, sheet_name=sheet_name, encoding=file_encoding)
text = '\n'.join(df["回答"])  # 回答列名を適宜変更してください

print(text)

print(tex)の結果です。

甘くてフルーティーな味で最高
チョコレートとストロベリーの組み合わせが最高!
香りが良くて食べやすい!おすすめです。
子供たちも大喜びのおいしさ!リピート決定。
さわやかな酸味と濃厚なチョコのバランスが絶妙。

2. テキストファイルの正規化

読み込んだテキストの正規化(表記の揺れの是正)を行います。正規化=文字の統一化です。

NFKC(Normalization Form KC)は、Unicodeの正規化形式の一つであり、日本語のテキストに特に有用です。NFKC形式では、以下のような処理が行われます:

  • 半角カタカナ→全角カタカナ
  • 全角英数字記号の半角化
  • 互換性のある文字の置換(①→1, ㋿→令和)

もうひとつ日本語表記の揺れを補正するライブラリとしてneologdnがあります。mecab と neologdn辞書での形態素解析をする前の正規化(表記の揺れの是正)として推奨されていますが、それ以外のケースでも有用です。以下のような処理が行われます。

  • 半角カタカナ→全角カタカナ
  • 全角英数字記号の半角化
  • 連続した長音記号を削除
  • 文字と文字の間のスペースを削除

実際に2つの正規化処理でどのようにテキストが変換されるのかをみていきましょう。


NFKCで正規化

NFKCの特徴は、互換性のある文字の置換です。①、㋿、㌢ といった文字が、1、令和、センチなどに変換されます。

import unicodedata

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"

normalized_text = unicodedata.normalize('NFKC', text)
print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナ ABCABC ! ! 123 123 1テキスト マイニング わーーーい 1984〜2000 令和 センチ

neologdnで正規化

neologdnを使うにはパッケージのインストールが必要です。neologdnでは、"テキスト マイニング"→"テキストマイニング"と文字間のスペースが削除されたり、連続する長音の削除、チルダの削除などが行われます。

!pip install neologdn

import neologdn

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"
normalized_text = neologdn.normalize(text)

print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナABCABC ! ! 123 123 ①テキストマイニングわーい19842000 ㋿㌢

NFKCとneologdnでテキストを正規化する

NFKCとneologdnには同じ正規化処理もあれば異なる処理もあるので、二つを組み合わせて実施しましょう。NKFCで正規化をした結果をneologdnで正規化します。

!pip install neologdn

import unicodedata
import neologdn

text = "カタカナカタカナ ABCABC ! ! 123 123 ①テキスト マイニング わーーーい 1984〜2000 ㋿ ㌢"

normalized_text = neologdn.normalize(unicodedata.normalize('NFKC', text))

print(normalized_text)

実行すると下記の結果が出力されます。

カタカナカタカナABCABC ! ! 123 123 1テキストマイニングわーい19842000令和センチ

読み込んだテキストを正規化する

sample.txtは正規化しても結果は変わりませんが、テキストファイルを読み込んで正規化するプログラムの例が下記になります。

!pip install neologdn

import chardet
import unicodedata
import neologdn

# ファイルのエンコーディング情報を取得
file_path = '/content/sample_data/sample.txt'
with open(file_path, 'rb') as f:
    file_encording= chardet.detect(f.read())['encoding']

# 取得したエンコーディング情報でファイルを読み込む
with open(file_path, 'r', encoding=file_encording) as f:
    text = f.read()
    
# テキストの正規化
normalized_text = neologdn.normalize(unicodedata.normalize('NFKC', text))

print(normalized_text)

正規化されたテキスト文章が、変数 normalized_text に格納されます。

次回は、日本語の文章をテキストマイニングする前処理として重要な形態素解析(単語や文節で区切り、品詞等を判別する)について説明していきたいと思います。

0 件のコメント:

コメントを投稿

アクセス上位(過去7日間)