Python でのテキスト分類の例
人工知能と自然言語処理テクノロジーの発展により、テキスト分類は広く使用されるテクノロジーの 1 つとなり、自然言語処理タスクで重要な役割を果たすことができます。人気のあるプログラミング言語である Python の強力な自然言語処理ライブラリと、NLTK、Scikit-learn、Tensorflow などの機械学習ライブラリにより、Python でのテキスト分類の実装が非常に簡単になります。
この記事では、Python テキスト分類の例を紹介し、例を通じて Python をテキスト分類に使用する方法を示します。
テキスト分類の前に、データを収集、クリーニング、前処理する必要があります。ここでは例として感情分析タスクのデータセットを使用します。このデータセットには、肯定的な感情と否定的な感情をそれぞれ表す 2 つのカテゴリの映画レビューが含まれています。データセットは映画レビュー Web サイト IMDb からのもので、http://ai.stanford.edu/~amaas/data/sentiment/ からダウンロードできます。
データセット内の各コメントは、ファイル名にタグpos
またはneg
が含まれるテキスト ファイルです。 Python のos
ライブラリを使用してファイルを読み取り、テキストとラベルを Pandas DataFrame に保存して、その後の処理を容易にすることができます。
import os import pandas as pd # 读取文件 def read_data(folder): files = os.listdir(folder) data = {'text': [], 'sentiment': []} for file in files: with open(os.path.join(folder, file), 'r') as f: data['text'].append(f.read()) data['sentiment'].append(file.split('.')[0]) return pd.DataFrame.from_dict(data) # 读取数据集 train_folder = 'aclImdb/train' test_folder = 'aclImdb/test' train_data = read_data(train_folder) test_data = read_data(test_folder)
次に、Pandas のgroupby
メソッドを使用して、データセット内のテキストの長さと感情ラベルの割合をカウントします。
# 统计文本长度 train_data['text_len'] = train_data['text'].apply(len) test_data['text_len'] = test_data['text'].apply(len) # 统计情感标签比例 train_sentiment_pct = train_data.groupby('sentiment').size() / len(train_data) test_sentiment_pct = test_data.groupby('sentiment').size() / len(test_data) print('Train Sentiment Distribution: {} '.format(train_sentiment_pct)) print('Test Sentiment Distribution: {} '.format(test_sentiment_pct))
上記のコードを実行すると、データセット内の肯定的なコメントと否定的なコメントの数がほぼ同じであり、センチメント ラベルが均等に分布していることがわかります。
テキストを分類する前に、テキストをコンピュータが理解できる形式に変換する必要があります。ここでは、特徴抽出にバッグオブワードモデルを使用します。
バッグ オブ ワード モデルは、テキスト内の各単語の重要性が等しいという前提に基づいています。そのため、テキスト内のすべての単語が抽出されてボキャブラリー (語彙) が形成され、その後、それぞれの単語が抽出されます。 word is テキストはベクトルとして表され、ベクトルの各要素はテキスト内に単語が出現する回数を表します。
Scikit-learn では、特徴抽出にCountVectorizer
を使用できます。
from sklearn.feature_extraction.text import CountVectorizer # 创建CountVectorizer对象 vectorizer = CountVectorizer(stop_words='english') # 将文本转换为向量 train_features = vectorizer.fit_transform(train_data['text']) test_features = vectorizer.transform(test_data['text']) # 打印特征维度 print('Train Feature Dimension: {}'.format(train_features.shape)) print('Test Feature Dimension: {}'.format(test_features.shape))
上記のコードはテキストをベクトルに変換します。各テキストは語彙のサイズの次元を持つスパース ベクトルです。ご覧のとおり、このデータ セットには合計 250,000 の特徴があり、その次元は非常に高くなっています。
Scikit-learn の複数の分類子を使用してトレーニングと評価を行います。ここでは、ロジスティック回帰分類器、単純ベイズ分類器、サポート ベクター マシン分類器、およびランダム フォレスト分類器を使用して、どの分類器が最もパフォーマンスが高いかを確認します。
from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import MultinomialNB from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import f1_score, accuracy_score # 训练和评估函数 def train_and_evalute(classifier, train_features, train_labels, test_features, test_labels): # 训练分类器 classifier.fit(train_features, train_labels) # 在训练集和测试集上计算F1分数和准确率 train_predictions = classifier.predict(train_features) test_predictions = classifier.predict(test_features) train_f1 = f1_score(train_labels, train_predictions, pos_label='pos') test_f1 = f1_score(test_labels, test_predictions, pos_label='pos') train_accuracy = accuracy_score(train_labels, train_predictions) test_accuracy = accuracy_score(test_labels, test_predictions) # 打印评估结果 print('Train F1 Score: {0:.3f}'.format(train_f1)) print('Test F1 Score: {0:.3f}'.format(test_f1)) print('Train Accuracy: {0:.3f}'.format(train_accuracy)) print('Test Accuracy: {0:.3f}'.format(test_accuracy)) # 训练和评估各个分类器 classifiers = [ ('Logistic Regression', LogisticRegression(max_iter=1000)), ('Multinomial Naive Bayes', MultinomialNB()), ('Support Vector Machine', SVC(kernel='linear')), ('Random Forest', RandomForestClassifier(n_estimators=100)) ] for classifier_name, classifier in classifiers: print(' {}'.format(classifier_name)) train_and_evalute(classifier, train_features, train_data['sentiment'], test_features, test_data['sentiment'])
上記のコードは、トレーニング セットとテスト セットを使用して各分類器を評価します。 Naive Bayes 分類器はトレーニング セットとテスト セットの両方で非常に優れたパフォーマンスを示し、F1 スコア 0.87 と精度 0.85 を達成していることがわかります。他の分類器のパフォーマンスはわずかに劣りましたが、同様に良好なパフォーマンスを示しました。
この記事では、データ収集と前処理、特徴抽出、モデルのトレーニングと評価を含む、Python でのテキスト分類の例を紹介します。例を通して、テキスト分類に Python を使用する方法を学び、ロジスティック回帰、単純ベイズ、サポート ベクター マシン、ランダム フォレストに基づくテキスト分類アルゴリズムについて学びました。
実際の状況では、テキスト分類のパフォーマンスを向上させるために、ストップワードの削除、ステミング、単語ベクトル表現など、テキスト データのより詳細な処理と分析を実行する必要がある場合があります。同時に、畳み込みニューラル ネットワーク (CNN) やリカレント ニューラル ネットワーク (RNN) などの深層学習モデルをテキスト分類に使用してみることもできます。
以上がPython でのテキスト分類の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。