>백엔드 개발 >파이썬 튜토리얼 >Python의 텍스트 분류 예

Python의 텍스트 분류 예

PHPz
PHPz원래의
2023-06-09 20:22:371628검색

파이썬의 텍스트 분류 예제

인공지능과 자연어 처리 기술의 발전으로 텍스트 분류는 널리 사용되는 기술 중 하나가 되었으며, 자연어 처리 작업에서 중요한 역할을 할 수 있습니다. 널리 사용되는 프로그래밍 언어인 Python의 강력한 자연어 처리 라이브러리와 NLTK, Scikit-learn 및 Tensorflow와 같은 기계 학습 라이브러리를 사용하면 Python에서 텍스트 분류를 매우 쉽게 구현할 수 있습니다.

이 글에서는 Python 텍스트 분류의 예를 소개하고 예를 통해 Python을 사용하여 텍스트 분류하는 방법을 보여줍니다.

  1. 데이터 수집 및 전처리

텍스트 분류에 앞서 데이터를 수집, 정리 및 전처리해야 합니다. 여기서는 감정 분석 작업의 데이터 세트를 예로 사용하겠습니다. 이 데이터 세트에는 각각 긍정적인 감정과 부정적인 감정을 나타내는 두 가지 범주의 영화 리뷰가 포함되어 있습니다. 데이터 세트는 영화 리뷰 웹사이트 IMDb에서 제공되며 http://ai.stanford.edu/~amaas/data/sentiment/에서 다운로드할 수 있습니다.

데이터 세트의 각 댓글은 파일 이름에 pos 또는 neg 태그가 포함된 텍스트 파일입니다. Python의 os 라이브러리를 사용하여 파일을 읽은 다음 텍스트와 레이블을 Pandas DataFrame에 저장하여 후속 처리를 용이하게 할 수 있습니다. posneg。我们可以使用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))

运行以上代码,我们可以看到数据集中正面和负面评论的数量大致相同,情感标签分布均匀。

  1. 特征提取

在进行文本分类之前,需要将文本转换为计算机可以理解的形式。这里我们将使用词袋模型来进行特征提取。

词袋模型是基于一个假设:文本中的每个词的重要性都是相等的,因此将文本中所有的单词都提取出来,形成一个词汇表(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'])

위 코드를 실행하면 데이터 세트의 긍정적인 댓글과 부정적인 댓글의 수가 거의 동일하고 감정 라벨이 고르게 분포되어 있음을 알 수 있습니다.
    1. 특징 추출

    텍스트를 분류하기 전에 텍스트를 컴퓨터가 이해할 수 있는 형태로 변환해야 합니다. 여기서는 특징 추출을 위해 Bag-of-Words 모델을 사용하겠습니다.

    단어주머니 모델은 텍스트에 있는 각 단어의 중요도가 동일하므로 텍스트에 있는 모든 단어를 추출하여 어휘(어휘)를 형성하고, 각 텍스트는 다음과 같이 표현된다는 가정을 기반으로 합니다. 벡터는 벡터의 각 요소가 텍스트에 단어가 나타나는 횟수를 나타냅니다.

      Scikit-learn에서는 특징 추출을 위해 CountVectorizer를 사용할 수 있습니다.
    1. rrreee
    2. 위 코드는 텍스트를 벡터로 변환합니다. 각 텍스트는 어휘 크기 차원의 희소 벡터입니다. 보시다시피 이 데이터 세트에는 총 250,000개의 기능이 있으며 차원이 매우 높습니다.

    모델 훈련 및 평가

    🎜Scikit-learn에서 여러 분류자를 사용하여 훈련하고 평가합니다. 여기서는 Logistic Regression Classifier, Naive Bayes Classifier, Support Vector Machine Classifier 및 Random Forest Classifier를 사용하여 어떤 분류기가 가장 잘 수행되는지 확인합니다. 🎜rrreee🎜위 코드는 훈련 세트와 테스트 세트를 사용하여 각 분류기를 평가합니다. Naive Bayes 분류기는 훈련 세트와 테스트 세트 모두에서 매우 잘 수행되어 F1 점수 0.87과 정확도 0.85를 달성하는 것을 볼 수 있습니다. 다른 분류기의 성능은 약간 떨어지지만 성능도 좋습니다. 🎜🎜🎜결론🎜🎜🎜이 기사에서는 데이터 수집 및 전처리, 특징 추출, 모델 훈련 및 평가를 포함하여 Python의 텍스트 분류 예를 소개합니다. 예제를 통해 텍스트 분류를 위해 Python을 사용하는 방법을 배웠고 로지스틱 회귀, Naive Bayes, 지원 벡터 머신 및 Random Forest를 기반으로 하는 텍스트 분류 알고리즘에 대해 배웠습니다. 🎜🎜실제 상황에서는 텍스트 분류 성능을 향상시키기 위해 불용어 제거, 형태소 분석, 단어 벡터 표현 등과 같은 텍스트 데이터에 대한 보다 심층적인 처리 및 분석을 수행해야 할 수도 있습니다. 동시에 텍스트 분류를 위해 CNN(컨벌루션 신경망) 및 RNN(반복 신경망)과 같은 딥 러닝 모델을 사용해 볼 수도 있습니다. 🎜

위 내용은 Python의 텍스트 분류 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.