파이썬의 텍스트 분류 예제
인공지능과 자연어 처리 기술의 발전으로 텍스트 분류는 널리 사용되는 기술 중 하나가 되었으며, 자연어 처리 작업에서 중요한 역할을 할 수 있습니다. 널리 사용되는 프로그래밍 언어인 Python의 강력한 자연어 처리 라이브러리와 NLTK, Scikit-learn 및 Tensorflow와 같은 기계 학습 라이브러리를 사용하면 Python에서 텍스트 분류를 매우 쉽게 구현할 수 있습니다.
이 글에서는 Python 텍스트 분류의 예를 소개하고 예를 통해 Python을 사용하여 텍스트 분류하는 방법을 보여줍니다.
텍스트 분류에 앞서 데이터를 수집, 정리 및 전처리해야 합니다. 여기서는 감정 분석 작업의 데이터 세트를 예로 사용하겠습니다. 이 데이터 세트에는 각각 긍정적인 감정과 부정적인 감정을 나타내는 두 가지 범주의 영화 리뷰가 포함되어 있습니다. 데이터 세트는 영화 리뷰 웹사이트 IMDb에서 제공되며 http://ai.stanford.edu/~amaas/data/sentiment/에서 다운로드할 수 있습니다.
데이터 세트의 각 댓글은 파일 이름에 pos
또는 neg
태그가 포함된 텍스트 파일입니다. Python의 os
라이브러리를 사용하여 파일을 읽은 다음 텍스트와 레이블을 Pandas DataFrame에 저장하여 후속 처리를 용이하게 할 수 있습니다. 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))그런 다음 Pandas의
groupby
방법을 사용하여 데이터 세트에서 텍스트 길이와 감정 레이블의 비율을 계산할 수 있습니다. 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'])위 코드를 실행하면 데이터 세트의 긍정적인 댓글과 부정적인 댓글의 수가 거의 동일하고 감정 라벨이 고르게 분포되어 있음을 알 수 있습니다.
텍스트를 분류하기 전에 텍스트를 컴퓨터가 이해할 수 있는 형태로 변환해야 합니다. 여기서는 특징 추출을 위해 Bag-of-Words 모델을 사용하겠습니다.
단어주머니 모델은 텍스트에 있는 각 단어의 중요도가 동일하므로 텍스트에 있는 모든 단어를 추출하여 어휘(어휘)를 형성하고, 각 텍스트는 다음과 같이 표현된다는 가정을 기반으로 합니다. 벡터는 벡터의 각 요소가 텍스트에 단어가 나타나는 횟수를 나타냅니다.
CountVectorizer
를 사용할 수 있습니다. 위 내용은 Python의 텍스트 분류 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!