欢迎访问宙启技术站
智能推送

使用Python的NLTK库进行中文文本分类

发布时间:2024-01-08 13:05:45

NLTK(Natural Language Toolkit)是一个在Python中进行自然语言处理(NLP)任务的库。虽然NLTK主要用于英文文本处理,但也支持一些中文NLP任务,如中文文本分类。

下面是使用Python的NLTK库进行中文文本分类的示例代码:

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 分词
def tokenize(text):
    return ' '.join(jieba.cut(text))

# 读取数据
def load_data(file_path):
    texts = []
    labels = []
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            label, text = line.strip().split('\t')
            texts.append(tokenize(text))
            labels.append(label)
    return texts, labels

# 训练分类器
def train_classifier(texts, labels):
    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(texts)
    classifier = SVC()
    classifier.fit(X, labels)
    return vectorizer, classifier

# 测试分类器
def test_classifier(texts, labels, vectorizer, classifier):
    X = vectorizer.transform(texts)
    predicted_labels = classifier.predict(X)
    accuracy = accuracy_score(labels, predicted_labels)
    return accuracy

# 主函数
def main():
    # 加载训练数据
    train_texts, train_labels = load_data('train_data.txt')

    # 加载测试数据
    test_texts, test_labels = load_data('test_data.txt')

    # 训练分类器
    vectorizer, classifier = train_classifier(train_texts, train_labels)

    # 测试分类器
    accuracy = test_classifier(test_texts, test_labels, vectorizer, classifier)
    print('Accuracy:', accuracy)

if __name__ == '__main__':
    main()

在上面的代码中,我们首先导入了必要的包,如jieba用于中文分词,sklearn中的TfidfVectorizer用于文本特征提取,SVC用于分类器构建,以及accuracy_score用于计算分类器的准确率。

接下来,我们定义了几个辅助函数。tokenize函数使用jieba对文本进行分词,并以空格分隔分词结果。load_data函数用于加载训练数据和测试数据,其中每一行数据由标签和文本内容组成,以制表符分隔。train_classifier函数用训练数据构建分类器,并返回特征提取器和分类器对象。test_classifier函数使用特征提取器和分类器对测试数据进行分类,并返回准确率。

最后,我们在主函数中调用上述函数进行训练和测试。首先,我们加载训练数据和测试数据,然后使用训练数据训练分类器,最后使用测试数据测试分类器并打印准确率。

要运行上述代码,需要先安装NLTK库和jieba库,以及scikit-learn库。这些库可以通过pip命令进行安装。

请注意,上述代码只是一个简单的示例,仅供参考。在实际应用中,可能需要进行更多的数据预处理、特征工程和模型选择等步骤,以获得更好的分类效果。