Exemple de classification de texte en Python
Avec le développement de l'intelligence artificielle et de la technologie de traitement du langage naturel, la classification de texte est devenue l'une des technologies les plus utilisées et elle peut jouer un rôle important dans les tâches de traitement du langage naturel. En tant que langage de programmation populaire, les puissantes bibliothèques de traitement du langage naturel et les bibliothèques d'apprentissage automatique de Python, telles que NLTK, Scikit-learn et Tensorflow, rendent la classification de texte très facile à mettre en œuvre dans Python.
Cet article présentera des exemples de classification de texte Python et démontrera comment utiliser Python pour la classification de texte à travers des exemples.
Avant la classification du texte, les données doivent être collectées, nettoyées et prétraitées. Ici, nous utiliserons un ensemble de données provenant d'une tâche d'analyse des sentiments à titre d'exemple. Cet ensemble de données contient deux catégories de critiques de films, représentant respectivement des sentiments positifs et négatifs. L'ensemble de données provient du site Web de critiques de films IMDb et peut être téléchargé sur http://ai.stanford.edu/~amaas/data/sentiment/.
Chaque commentaire de l'ensemble de données est un fichier texte avec la balise pos
ou neg
dans le nom du fichier. Nous pouvons utiliser la bibliothèque os
de Python pour lire le fichier, puis stocker le texte et les étiquettes dans un Pandas DataFrame pour faciliter le traitement ultérieur. 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))
运行以上代码,我们可以看到数据集中正面和负面评论的数量大致相同,情感标签分布均匀。
在进行文本分类之前,需要将文本转换为计算机可以理解的形式。这里我们将使用词袋模型来进行特征提取。
词袋模型是基于一个假设:文本中的每个词的重要性都是相等的,因此将文本中所有的单词都提取出来,形成一个词汇表(vocabulary),然后将每个文本表示为一个向量,向量的每个元素代表该词在该文本中出现的次数。
在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))
groupby
de Pandas pour compter la proportion de longueur de texte et d'étiquettes d'émotion dans l'ensemble de données. 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'])
Avant la classification du texte, le texte doit être converti en une forme que l'ordinateur peut comprendre. Ici, nous utiliserons le modèle du sac de mots pour l'extraction de fonctionnalités.
Le modèle du sac de mots est basé sur une hypothèse : l'importance de chaque mot dans le texte est égale, donc tous les mots du texte sont extraits pour former un vocabulaire (vocabulaire), puis chaque texte est représenté comme Un vecteur, chaque élément du vecteur représente le nombre de fois que le mot apparaît dans le texte.
CountVectorizer
pour l'extraction de fonctionnalités. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!