ゼファーネットのロゴ

感情分析を実行するためのテキスト前処理技術!

日付:

この記事は、の一部として公開されました データサイエンスブログソン

概要

今日の世界では、最大の情報源のXNUMXつはテキストデータであり、これは本質的に構造化されていません。 製品のレビューやフィードバックから顧客の感情を見つけたり、ソーシャルメディアデータから意見を抽出したりすることは、テキスト分析のいくつかの例です。

テキストデータから洞察を見つけることは、構造化データほど簡単ではなく、広範なデータ前処理が必要です。 回帰、分類、クラスタリングなど、これまでに調査したアルゴリズムは、データがクリーンアップおよび準備された場合にのみテキストデータに適用できます。

この記事では、で利用可能なデータセットを使用します

https://www.kaggle.com/amitkumardas/sentiment-train

感情を分類するための分類モデルを構築するため。

データは、さまざまな映画でユーザーが表現した感情で構成されています。 ここで、各コメントはレコードであり、ポジティブまたはネガティブに分類されます。

感情の分類

前の段落で説明したこのデータセットには、いくつかの映画に関するレビューコメントが含まれています。 データセット内のコメントは、すでにポジティブまたはネガティブとしてラベル付けされています。 データセットには、タブ文字で区切られた次のXNUMXつのフィールドが含まれています。

1.テキスト:- 実際のレビューコメント

2.感情:- 肯定的な感情には1のラベルが付けられ、否定的な感情には0のラベルが付けられます。

この記事では、テキストデータセットの前処理のいくつかの機能について説明します。

テキストの前処理

構造データとは異なり、機能はテキストデータで明示的に使用できません。 したがって、テキストデータから特徴を抽出するプロセスを使用する必要があります。 XNUMXつの方法は、各単語を特徴と見なし、単語が文に存在するかどうかを把握するための手段を見つけることです。 これは、bag-of-words(BoW)モデルと呼ばれます。 つまり、各文は単語の袋として扱われます。 各文はドキュメントと呼ばれ、すべてのドキュメントの集合はコーパスと呼ばれます。

これは、次のようなテキストデータに対して実行できる前処理機能のリストです。

これらの前処理機能については、次のサブセクションで説明します。

 Bag-of_words(BoW)モデル

Bow Modelを作成する最初のステップは、コーパスで使用されるすべての単語の辞書を作成することです。 この段階では、文法について心配する必要はなく、単語の出現のみがキャプチャされます。 次に、各ドキュメントを、ドキュメントで使用可能な単語を表すベクトルに変換します。 BoWモデルで単語の重要性を識別する方法はXNUMXつあります。

これらのベクトルモデルについては、次のサブセクションで説明します。

a)カウントベクトルモデル

次のXNUMXつのドキュメントを検討してください。

注:IPLはインディアンプレミアリーグの略です。

上記の1つのドキュメントの完全な語彙セットには、I、really、never、like、IPLなどの単語が含まれます。 これらの単語は特徴(x5からx1)と見なすことができます。 カウントワードを作成するために、次の表に示すように、ドキュメント内の各ワードの出現をカウントします。 表のy列は、文の感情を示しています。肯定的な感情の場合は0、否定的な感情の場合はXNUMXです。

カウントベクトルモデル| テキスト前処理技術

b)期間頻度ベクトルモデル

用語頻度(TF)ベクトルは、コーパス内の各ドキュメントに対して計算され、ドキュメント内の各用語の頻度です。 それはによって与えられます、

期間頻度(TFi)=(ドキュメント内の単語iの出現数)/(ドキュメント内の単語の総数)

ここで、TFiは単語の頻度という用語です。 XNUMXつのドキュメントのTF表現を表に示します。

TFIDFモデル| テキスト前処理技術

c)期間頻度–逆ドキュメント頻度(TF-IDF)

TF-IDFは、コーパス内のドキュメントにとって単語がどれほど重要であるかを測定します。 単語の重要性は、単語がドキュメントに表示される回数に比例して増加しますが、コーパスに存在する単語の頻度によって減少します。 ドキュメント内の単語IのTF-IDFは次の式で与えられます。

TF-IDFi =TFi* ln(1+(N / Ni))

コラボレー Nは、コーパス内のドキュメントの総数です。Ni 単語iを含むドキュメントの数です。

上記のXNUMXつのドキュメントの各単語のIDF値は、次の表に示されています。

IDF

XNUMXつのドキュメントのTF-IDF値を次の表に示します。

TFIDF2 | テキスト前処理技術

データセットのカウントベクトルの作成

データセット内の各ドキュメントは、TFまたはTF-IDFベクトルに変換する必要があります。sklearn.feature_extraction.textモジュールは、テキストデータからTFベクトルとTF-IDFベクトルの両方を作成するためのクラスを提供します。 CountVectorizerを使用してカウントベクトルを作成します。

次のコードを使用して、すべてのドキュメントに存在するすべての単語の辞書を処理および作成します。 辞書には、コーパス全体のすべての一意の単語が含まれます。 また、辞書内の各単語は機能として扱われます。

sklearn.feature_extraction.textからインポートCountVectorizer
count_vectorize = CountVectorizer()
feature_vector = count_vectorize.fit(train_data.Text)
features = feature_vector.get_feature_names()
print( "機能の総数:"、len(features))

機能の数

コーパス内の特徴と一意の単語の総数は1903です。特徴のランダムサンプルは、次のrandom.sample()メソッドを使用して取得できます。

ランダムにインポート
random.sample(features、10)

サンプル機能| テキスト前処理技術

上記の辞書を使用すると、カウントベクトライザーのtransform()メソッドを使用して、データセット内のすべてのドキュメントをカウントベクトルに変換できます。

train_ds_features = count_vectorize.transform(train_data.Text)
type(train_ds_features)

すべてのドキュメントのカウントベクトルを含むデータフレームtrain_ds_featuresの次元は、データフレームの形状変数によって与えられます。

train_ds_features.shape

列車データの形状| テキスト前処理技術

ドキュメントをベクトルに変換すると、1903の特徴または次元を持つスパース行列が作成されます。 スパース行列表現は、ゼロ以外の値とそのインデックスのみをベクトルに格納します。 マトリックスにゼロ以外の実際の値がいくつ存在するかを知るために、dataFrameでgetnnz()メソッドを使用できます。

train_ds_features.getnnz()

出力は53028です。行列のゼロ値に対する非ゼロ値の比率を計算するには、非ゼロ値の数を行列の次元で除算します。

print( "マトリックスの密度:"、train_ds_features.getnnz()* 100 /
 (train_ds_features.shape [0] * train_ds_features.shape [1]))

出力は:

マトリックスの密度:0.4916280092607186

行列の非ゼロ値は1%未満です。つまり、99%を超える値はゼロ値です。 これは非常にまばらな表現です。

ドキュメントベクトルの表示

カウントベクトルを視覚化するために、この行列をデータフレームに変換し、列名を実際のフィーチャ名に設定します。 次のコマンドは、カウントベクトルを表示し、最初のレコードを出力するために使用されます。

train_ds_df = pd.DataFrame(train_ds_features.todense())
train_ds_df.columns =機能
train_data [0:1]

ドキュメントベクトル| テキスト前処理技術

次に、文の単語に従ってすべての列を選択し、以下に印刷します。

train_ds_df [['ok'、 'brokeback'、 'mountain'、 'is'、 'such'、 'horrible'、 'movie']] [0:1]

列車データ

はい、カウントベクトルの特徴は適切に1に設定されています。ベクトルは「OKブロークバックマウンテンはとても恐ろしい映画です」という文を表しています。

 Low_Frequencyワードの削除

テキストを扱う際の課題のXNUMXつは、コーパスで使用できる機能の単語数が多すぎることです。 機能の数は簡単に数万を超える可能性があります。 各特徴または単語の頻度は、ヒストグラムを使用して分析できます。 各特徴または単語の合計出現回数を計算するには、np.sum()メソッドを使用します。 ヒストグラムは、多数の特徴が非常にまれにしか発生しないことを示しました。

features_counts = np.sum(train_ds_features.toarray()、axis = 0)
features_counts_df = pd.DataFrame(dict(features = features、counts = features_counts))
plt.figure(figsize =(8,6))
plt.hist(features_counts_df.counts、bins = 50、range =(0,2000))
plt.xlabel( "単語の頻度")
plt.ylabel( '密度')

低頻度の単語を削除する| テキスト前処理技術

辞書で珍しい単語、たとえば、ドキュメントのいずれかに存在する単語を見つけるために、1に等しいカウントで特徴をフィルタリングできます。

len(features_counts_df [features_counts_df.counts == 1])

出力は233です。

コーパス内のすべてのドキュメントに233回だけ存在する1000語があります。 これらの単語は無視できます。 カウントベクトルの作成中にmax_featuresパラメーターを15に設定することで、フィーチャの数を制限できます。 次に、最初のXNUMX語とその数を降順で出力します。

count_vectorizer = CountVectorizer(max_features = 1000)
feature_vector = count_vectorizer.fit(train_data.Text)
features = feature_vector.get_feature_names()
train_ds_features = count_vectorizer.transform(train_data.Text)
features_counts = np.sum(train_ds_features.toarray()、axis = 0)
features_counts = pd.DataFrame(dict(features = features、counts = features_counts))
features_counts.sort_values( 'counts'、ascending = False)[0:15]

機能とカウント| テキスト前処理技術

選択した機能のリストには、、 is、wasなどの単語が含まれていることがわかります。これらの単語は、ドキュメントの感情を判断する上で重要ではありません。 これらの単語はストップワードと呼ばれ、辞書から削除できます。 これにより、機能の数がさらに減ります。

 ストップワードの削除

sklearn.feature_extraction.textは、英語で事前定義されたストップワードのリストを提供します。これは、機能セットである辞書からストップワードを削除するための参照として使用できます。

sklearn.feature_extractionインポートテキストから
my_stop_words = text.ENGLISH_STOP_WORDS
print( "いくつかのストップワード:"、list(my_stop_words)[0:10])

出力:-

いくつかのストップワード:['nowhere'、 'after'、 'whether'、 'full'、 'back'、 'eg'、 'itself'、 'seem'、

'interest'、 'upon']

また、追加のストップワードをリストに追加して削除することもできます。 たとえば、この場合、映画の名前と「映画」という単語自体がストップワードになる可能性があります。 これらの単語は、削除するストップワードの既存のリストに追加できます。 例えば

my_stop_words = text.ENGLISH_STOP_WORDS.union(['harry'、 'potter'、 'code'、 'vinci'、
                                                              'da'、 'harry'、 'mountain'、 'movie'、 'movies'])

異なる感情にまたがる単語の分布

ポジティブまたはネガティブな意味を持つ単語は、さまざまな感情のドキュメント全体で発生します。 これは、これらの単語がドキュメントの感情を予測するための優れた機能になる方法についての最初のアイデアを与える可能性があります。 たとえば、素晴らしいという言葉を考えてみましょう。

train_ds_df = pd.DataFrame(train_ds_features.todense())
train_ds_df.columns =機能
train_ds_df ['Sentiment'] = train_data.Sentiment
sn.barplot(x = '感情'、y = '素晴らしい'、データ= train_ds_df、推定量=合計)

図に示されているように、素晴らしいという言葉は主に肯定的な感情の文書に現れます。

感情

本当に好きな自然な言葉はどうですか?

sn.barplot(x = '感情'、y = '本当に'、データ= train_ds_df、推定量=合計)

図に示されているように、この単語は実際には主にポジティブおよびネガティブな感情文書に表示されます。

本当に

憎しみという言葉はどうですか?

sn.barplot(x = '感情'、y = '嫌い'、データ= train_ds_df、推定量=合計)

図に示されているように、憎しみという言葉は、ポジティブな感情よりもネガティブな感情で主に発生します。 これは絶対に理にかなっています。

嫌い

これにより、「素晴らしい」と「嫌い」という言葉がドキュメントの感情を判断する上で優れた機能になる可能性があるという最初のアイデアが得られます。

まとめ

この記事では、テキストデータは非構造化データであり、モデルを適用する前に広範な前処理が必要です。 ドキュメントまたはセンテンスは、フィーチャを構築するためにユニグラムまたはnグラムにトークン化できます。 ドキュメントは、単語またはn-gramを特徴とするベクトルとして表すことができます。 ベクトルは、単純なカウント、TF(期間頻度)またはTF-IDF値を使用して作成できます。 ストップワードを削除し、ステミングまたはレンマ化を適用することで、堅牢な機能セットを作成できます。 機能の数は、より高い頻度の機能のみを選択することによって制限することもできます。

著者について

こんにちは、カジャル・クマリです。 コンピューターサイエンス&エンジニアリングのIIT(ISM)ダンバードで修士号を取得しました。 現在、私はハイデラバードで機械学習エンジニアとして働いています。 また、私が書いた他のいくつかのブログをチェックすることもできます ページ をご覧ください

この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、作成者の裁量で使用されています。

PlatoAi。 Web3の再考。 増幅されたデータインテリジェンス。
アクセスするには、ここをクリックしてください。

出典:https://www.analyticsvidhya.com/blog/2021/08/text-preprocessing-techniques-for-performing-sentiment-analysis/

スポット画像

最新のインテリジェンス

スポット画像