はじめに
テキストデータの前処理や可視化を簡単に行うことができるTextheroを使ってみたので、使い方をまとめました。
目次
Textheroとは
「texthero(テキストヒーロー)」とは、テキストデータの前処理やベクトル化、表現および可視化を行うことができるオープンソースのライブラリです。
非常に新しいライブラリで、現在β版としてリリースされています(2021/03/09時点)。
Pythonによる数行の簡単な実装で、様々な自然言語処理のタスクを行うことが可能です。
今回は、使い方を学ぶという目的で、英語を対象にテキスト解析してみます。
※公式ページによると、今後日本語をはじめ多言語に対応予定とのことです。
Textheroの使い方
※以下、言語はPython、環境はGoogle Colaboratoryを使用します。ご自身の環境に合わせて、適宜読み替えて下さい。
それでは早速Textheroを使ってみましょう。
pipでインストールします。
pip install texthero
あとはインポートするだけです。
pandasも使用するので、併せてインポートしておきます。
import texthero as hero
import pandas as pd
前処理
ではまず、前処理をやってみます。
以下の文字列を扱ってみましょう。pandasでSeriesとして用意しておきます。
row_text = " Hi! I've started kàgglé, and I'm enjoying."
s = pd.Series(row_text)
Textheroを使用すれば、不要なスペースの削除、大文字・小文字をどちらかに統一、ストップワード(注釈)の除去、といったことが簡単にできます。
以下、いくつかの前処理を行ってみました。
s = hero.remove_whitespace(s) # スペースの削除
print(s)
s = hero.remove_diacritics(s) # ダイアクリティカルマーク(発音区別符号。àやéなど)の削除
print(s)
s = hero.lowercase(s) # 小文字への統一
print(s)
s = hero.remove_punctuation(s) # 句読点の削除
print(s)
s = hero.remove_stopwords(s) # ストップワードの削除
print(s)
# 0 Hi! I've started kàgglé, and I'm enjoying.
# dtype: object
# 0 Hi! I've started kaggle, and I'm enjoying.
# dtype: object
# 0 hi! i've started kaggle, and i'm enjoying.
# dtype: object
# 0 hi i ve started kaggle and i m enjoying
# dtype: object
# 0 hi started kaggle enjoying
# dtype: object
ちなみに、特に引数を指定せずにclean
を使用することで、いい感じに色々な前処理を行ってくれます。
dirty_text = " Hi! I've started kàgglé, and I'm enjoying."
s = pd.Series(dirty_text)
hero.clean(s)
# 0 hi started kaggle enjoying
# dtype: object
可視化
Textheroでは、データを可視化することもできます。
データの準備
まずは可視化するデータを準備します。今回、公式ページと同様、BBCスポーツのデータを扱ってみます。
pandasを使用して、dataframeとして読み込んでおきます。
df = pd.read_csv(
"https://github.com/jbesomi/texthero/raw/master/dataset/bbcsport.csv"
)
少しわかりにくいので、df.to_csv('tmp.csv')
などとしてcsvファイルにし、エクセル等で開いて中身を確認してみましょう。
textとtopicというカラムがあり、あるtopic(athletics(陸上競技)やtennisなど)に対するtext(記事)が記載されているようです。
word cloud
それでは、word cloud(ワードクラウド)を描いてみます。word cloudは、頻出の単語ほど大きく表示するものです。
word cloudは、visualization.wordcloud
で表示することができます。
欠損値の除外(fillna
)のみ前処理を行ったテキストデータを可視化してみます。
raw_text = df['text']
clean_text = hero.clean(raw_text, pipeline=[
hero.preprocessing.fillna,
])
hero.visualization.wordcloud(clean_text, colormap='viridis', width=500, height=400, background_color='White')
word cloudを表示することができました。
結果を見ると、「the」「in」「to」など、重要ではない単語が多く表示されています。
ストップワードを除外する処理を入れたほうがよさそうです。
併せてその他の前処理も行い、再度word cloudを表示してみます。
clean_text = hero.clean(raw_text, pipeline=[
hero.preprocessing.fillna,
hero.preprocessing.lowercase,
hero.preprocessing.remove_digits,
hero.preprocessing.remove_punctuation,
hero.preprocessing.remove_diacritics,
hero.preprocessing.remove_stopwords # ストップワードの除去
])
hero.visualization.wordcloud(clean_text, colormap='viridis', width=500, height=400, background_color='White')
ストップワードが取り除かれていることが確認できます。
※日本語のword cloudについては、以下の記事をご参考下さい。
散布図
Textheroでは、単語をベクトル化した散布図を描くこともできます。
今回、データに対して以下の処理を行います。
df['tfidf'] = (
df['text']
.pipe(hero.clean)
.pipe(hero.tfidf)
)
df['pca'] = df['tfidf'].pipe(hero.pca)
df['kmeans_labels'] = (
df['tfidf']
.pipe(hero.kmeans, n_clusters=5)
.astype(str)
)
処理後のDataframeである df
は以下のようになっています。
それでは、この結果を散布図としてプロットしてみます。
topicごとの分類およびk近傍法による分類の2つを表示してみます。
散布図を表示することができました。
図を見ると、k近傍法による分類が、トピックごとに分けたものと非常に近いことがわかります。
注釈
- ストップワードとは、自然言語処理において分析対象から除外される単語のことです。日本語では、「は」「の」「です」など、英語では「a」「the」「of」などは頻繁に用いられますが、あまりに一般的な単語で分析対象としない場合が多く、その場合前処理などで除外することになります。
- tf-idfとは、文書中に含まれる単語の重要度を評価する手法の1つです。tf(Term Frequency、単語の出現頻度)とidf(Inverse Document Frequency、逆文書頻度)の積で表されます。
- PCA(Principal Component Analysis)とは、主成分分析とも呼ばれ、多変量解析の手法の1つです。互いに相関のあるデータの集まりの中から、データのばらつきである分散が大きい「主成分」を見つける際に利用されます。また、本記事のように多次元のベクトルを可視化する際に、次元削減のために使用されることもあります。
- k近傍法(k-nearest neighbor, k-NN)とは、多クラス分類で用いられる手法の1つです。ベクトル空間上にデータが存在しているとき、未知のデータに対して、既存のデータのなかから距離的に近いK個のデータを取得し、多数決によってどのクラスに属するかを推定します。