NLTKとpandasで簡単!自然言語処理におけるデータ前処理テクニック

はじめに

自然言語処理(Natural Language Processing, NLP)は、人工知能(Artificial Intelligence, AI)の分野の一つであり、テキストデータに対して様々な処理を行い、構造化されたデータを得ることができます。

NLPを実施するためには、テキストデータの前処理が必要不可欠です。本記事では、PythonのライブラリであるNatural Language Toolkit(NLTK)とpandasを使用した、NLPにおけるデータ前処理の方法を解説します。

NLTKとpandasの基本的な連携方法

NLTKは、自然言語処理のためのPythonライブラリであり、テキストデータを扱う様々な処理を提供しています。pandasは、データを扱うためのPythonライブラリであり、表形式のデータを扱うことができます。

NLTKとpandasを組み合わせることで、テキストデータの前処理とデータの管理・操作を簡単に行うことができます。NLTKとpandasを使った簡単なデータの読み込み方法を以下に示します。

import pandas as pd
import nltk
# NLTKのダウンロード
nltk.download('punkt')
# テキストデータの読み込み
data = pd.read_csv('textdata.csv', encoding='utf-8')

上記のコードでは、pandasのread_csv()関数を使用して、CSVファイルからデータを読み込んでいます。NLTKのdownload()関数を使用して、トークン化(後述)に必要なデータをダウンロードしています。

テキストデータの前処理:トークン化、ストップワード除去、ステミング

NLPにおいて、テキストデータを構造化されたデータに変換するためには、テキストデータの前処理が必要です。本節では、テキストデータの前処理のうち、トークン化、ストップワード除去、ステミングについて解説します。

トークン化

トークン化とは、テキストデータを単語や句に分割する処理です。トークン化を行うことで、テキストデータをより扱いやすくし、分析するための前処理を行うことができます。

NLTKでは、word_tokenize()関数を使用してトークン化を行うことができます。

from nltk.tokenize import word_tokenize
# テキストデータのトークン化
data['text_tokenized'] = data['text'].apply(lambda x: word_tokenize(x))

上記のコードでは、pandasのapply()関数を使用して、テキストデータの各行に対してトークン化を行い、新たな列としてtext_tokenizedを追加しています。

ストップワード除去

ストップワードとは、文章中で頻繁に現れるが、分析において重要でない単語のことを指します。ストップワードを除去することで、分析の精度を高めることができます。

NLTKでは、stopwords.words()関数を使用して、英語のストップワードリストを取得することができます。また、pandasのapply()関数を使用して、各行のトークンからストップワードを除去することができます。

from nltk.corpus import stopwords
# ストップワードリストの作成
stop_words = ['the', 'a']
# ストップワードの除去
data['text_no_stopwords'] = data['text_tokenized'].apply(lambda x: [word for word in x if not word.lower() in stop_words])

上記のコードでは、pandasのapply()関数を使用して、各行のトークンからストップワードを除去し、新たな列としてtext_no_stopwordsを追加しています。

ステミング

ステミングとは、単語の語幹を取り出す処理です。たとえば、runningやrunsなどの単語を、runという語幹に変換することができます。

NLTKでは、PorterStemmer()クラスを使用してステミングを行うことができます。

from nltk.stem.porter import PorterStemmer
# ステミングの実行
stemmer = PorterStemmer()
data['text_stemmed'] = data['text_no_stopwords'].apply(lambda x: [stemmer.stem(word) for word in x])

上記のコードでは、pandasのapply()関数を使用して、各行のトークンからストップワードを除去し、ステミングを行い、新たな列としてtext_stemmedを追加しています。

データフレームでのテキストデータの管理と操作

pandasを使用することで、テキストデータの管理と操作を簡単に行うことができます。本節では、pandasを使用したテキストデータの管理と操作について解説します。

列の追加・削除

pandasでは、df[‘column_name’]のように列の名前を指定して、特定の列にアクセスすることができます。新たな列を追加するには、以下のようにdf[‘new_column’] = valueのように書きます。

# 新たな列の追加
data['text_length'] = data['text'].apply(len)
# 列の削除
data = data.drop(columns=['text_tokenized'])

上記のコードでは、新たな列としてtext_lengthを追加し、drop()関数を使用してtext_tokenizedの列を削除しています。

データのフィルタリング

データのフィルタリングは、特定の条件を満たすデータのみを取り出すことができます。pandasでは、df[df[‘column_name’] > value]のように条件式を指定することができます。

# 特定の条件を満たすデータのみを取り出す
data_long = data[data['text_length'] > 100]

上記のコードでは、text_lengthが100よりも大きいデータのみを取り出して、data_longに格納しています。

特徴量抽出とベクトル化の方法

特徴量抽出とは、テキストデータから重要な情報を抽出することです。ベクトル化とは、特徴量を数値化することです。本節では、特徴量抽出とベクトル化の方法について解説します。

Bag-of-Wordsモデル

Bag-of-Wordsモデルは、テキストデータの特徴量を抽出するための方法の一つであり、各単語の出現回数を特徴量として抽出します。

NLTKでは、CountVectorizer()クラスを使用して、Bag-of-Wordsモデルを実装することができます。

from sklearn.feature_extraction.text import CountVectorizer
# CountVectorizerの初期化
vectorizer = CountVectorizer()
# 特徴量の抽出
X = vectorizer.fit_transform(data['text_stemmed'].apply(lambda x: ' '.join(x)))
# 特徴量の一覧の取得
feature_names = vectorizer.get_feature_names()

上記のコードでは、CountVectorizer()クラスを使用して、Bag-of-Wordsモデルを実装し、fit_transform()関数を使用して、特徴量を抽出しています。また、get_feature_names()関数を使用して、特徴量の一覧を取得しています。

TF-IDFモデル

TF-IDFモデルは、テキストデータの特徴量を抽出するための方法の一つであり、各単語の出現頻度と逆文書頻度を特徴量として抽出します。

NLTKでは、TfidfVectorizer()クラスを使用して、TF-IDFモデルを実装することができます。

from sklearn.feature_extraction.text import TfidfVectorizer
# TfidfVectorizerの初期化
vectorizer = TfidfVectorizer()
# 特徴量の抽出
X = vectorizer.fit_transform(data['text_stemmed'].apply(lambda x: ' '.join(x)))
# 特徴量の一覧の取得
feature_names = vectorizer.get_feature_names()

上記のコードでは、TfidfVectorizer()クラスを使用して、TF-IDFモデルを実装し、fit_transform()関数を使用して、特徴量を抽出しています。また、get_feature_names()関数を使用して、特徴量の一覧を取得しています。

まとめ

本記事では、NLTKとpandasを使用した自然言語処理の前処理の方法について解説しました。具体的には、トークン化、ストップワード除去、ステミングなどの前処理方法、データフレームでのテキストデータの管理と操作、Bag-of-WordsモデルやTF-IDFモデルを使用した特徴量抽出とベクトル化の方法について解説しました。

NLTKとpandasを組み合わせることで、自然言語処理の前処理を効率的に行うことができます。また、Bag-of-WordsモデルやTF-IDFモデルを使用することで、テキストデータの特徴量を抽出し、分析することができます。

自然言語処理においては、前処理が非常に重要な役割を果たします。正確な分析結果を得るためには、適切な前処理を行うことが必要不可欠です。NLTKとpandasを使いこなして、自然言語処理における前処理をマスターしましょう。