Python中的文字分類實例
隨著人工智慧和自然語言處理技術的發展,文字分類成為了廣泛應用的技術之一,它可以在自然語言處理任務中發揮重要作用。 Python作為一種流行的程式語言,其強大的自然語言處理庫和機器學習庫,如NLTK、Scikit-learn和Tensorflow等,使得文本分類在Python中變得非常容易實現。
本文將介紹Python文本分類的實例,並透過實例示範如何使用Python進行文字分類。
在進行文字分類之前,需要收集、清洗和預處理資料。這裡我們將使用一個情感分析任務的資料集作為實例。此資料集包含兩個類別的電影評論,分別代表正面和負面情感。資料集來自電影評論網站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))
運行以上程式碼,我們可以看到資料集中正面和負面評論的數量大致相同,情緒標籤分佈均勻。
在進行文字分類之前,需要將文字轉換為電腦可以理解的形式。這裡我們將使用詞袋模型來進行特徵提取。
詞袋模型是基於一個假設:文本中的每個詞的重要性都是相等的,因此將文本中所有的單字都提取出來,形成一個詞彙表(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))
以上程式碼將文字轉換為了向量,每個文字都是一個維度為詞彙表大小的稀疏向量。可以看到,該資料集中共有25萬個特徵,維度非常高。
使用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'])
以上程式碼使用了訓練集和測試集對各個分類器進行了評估。我們可以看到,樸素貝葉斯分類器在訓練集和測試集上表現都非常好,達到了0.87的F1分數和0.85的準確率。其他分類器的性能略遜一籌,但也都表現良好。
本文介紹了Python文本分類的實例,包括資料收集與預處理、特徵提取和模型訓練和評估。透過實例,我們學習如何使用Python進行文字分類,並且了解了基於邏輯迴歸、樸素貝葉斯、支援向量機和隨機森林的文本分類演算法。
在真實情況下,我們可能需要對文字資料進行更深入的處理和分析,例如移除停用詞、 stemming、詞向量表示等,以提高文字分類的表現。同時,也可以嘗試使用深度學習模型,例如卷積神經網路(CNN)和循環神經網路(RNN),來進行文字分類。
以上是Python中的文字分類實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!