您的当前位置:首页文本分类的思路

文本分类的思路

2024-12-14 来源:哗拓教育

终于在老公的言语讽刺之下,我终于把文本分类做了,虽然觉得之前我自己思考的文本分类的思路还是有一些可取之处的,但是考虑到我的文章或许可以给有需要的网友参考,因此还是不要误导别人了,直接给出正确的思路吧。

这里有一个重要问题要好好强调一下。

语料库最好大而全,否则严重影响分类效果。

好了下面就是正题了。

我在网上找了很多参考的文章,但是我觉得大同小异相互抄袭,都是转换成Bunch类型。
Bunch类型是sklearn的datasets中一种数据类型,和python中的字典型(dic)类似。


image.png

可以看看源码里面的描述。

第一步,切词

首先,介绍一下数据。我拿到的语料库是在网上下载的,复旦大学的中文文本分类的语料库。


image.png

打开是类似于上图的一个txt文档。


image.png
整体文件里面是这样的一个一个的文件夹,文件夹名就是类别名,打开每个文件夹里面属于这个类别的一系列文章。
这个是训练数据,测试数据可以在训练数据里面复制几个,或者自己随意找几个。

第二,读取每个文件夹中的每个文件,然后再用结巴分词,将分词后的文章按照原来的文件夹名和文件名重新存储一下。


image.png
这里有几个提一下,首先看到的分词方法是结巴分词。第二,看到的是原文档是GB2312,分词以后重新存储为utf-8型的。
第三,提醒一下,训练集和测试集都要切词。

第二,将切词后的文档转换成Bunch型。

from sklearn.datasets.base import Bunch
下图是方法。


image.png

还是要将训练集和测试集一起转换成Bunch型。我在代码里的注释十分仔细了。有兴趣的可以跟进去看一下源码,Bunch型其实和字典型很像。

第三,计算tf-idf

# 构建tfidf的向量空间
def vector_space(stopword_path, bunch_path, space_path, train_tfidf_path=None):
    # 加载停词表
    stpwrdlst = readfile(stopword_path).splitlines()
    # 加载bunch型
    bunch = readbunchobj(bunch_path)
    # 这里的tfidfspace定义了一个新的Bunch类型,在之前的bunch基础上增加了tdm=[],vocabulary={}两项。
    tfidfspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[],
                       vocabulary={})

    # 从主函数进来第一次调用这个方法的时候(对训练数据)train_tfidf_path实际为空,
    # 也就是说进入了else部分,然后writebunchobj,写了一个bunch的类型,也就是train数据的tfidf的向量空间。
    # 第二次在进入这个方法的时候,train_tfidf_path就不为空了,因此进入了if的部分,
    # 跟上面一样if执行完了以后又执行了writebunchobj,写了一个bunch类型,也就是test数据的tfidf的向量空间。
    if train_tfidf_path is not None:
        trainbunch = readbunchobj(train_tfidf_path)
        tfidfspace.vocabulary = trainbunch.vocabulary
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5,
                                     vocabulary=trainbunch.vocabulary)
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)

    else:
        vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5)
        tfidfspace.tdm = vectorizer.fit_transform(bunch.contents)
        tfidfspace.vocabulary = vectorizer.vocabulary_

    writebunchobj(space_path, tfidfspace)
    print("tf-idf词向量空间实例创建成功!!!")

第四,分类预测

这个就比较简单了,在sklearn的分类器中分类算法都可以替换。


image.png

这个虽然觉得大家都应该知道,但是还是提醒一下吧,在调用分类算法的时候,要先fit一下train数据,然后在predict一下test数据。

显示全文