文本分类入门

第一次接触深度学习,有错误地方请不吝指教。

文本分类是用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。

采用的编译器为sublime tetxt3 (轻量级的编译器,很方便,之前用pycharm 太卡)。

编译前需要配置好python的环境,我所用的版本为python 3.7。

本次所用到的python 包有pandas,numpy,sklearn。

pandas的用处:用pandas创建数据表。

numpy的用处:生成随机数。

sklearn的用处:

1 TfidfVectorizer:可以把一大堆文档转换成TF-IDF特征的矩阵。

2  CountVectorizer: 只考虑词汇在文本中出现的频率。

库的安装:

我用的是win10系统。进入cmd后,输入 where python,然后复制路径,输入 cd +"所复制的路径"。

然后输入pip install + 所需要的包名(如 numpy/sklearn)。

配置sublime的python编译环境 工具->编译系统->新建编译系统->把内容替换如下

{
    "cmd": ["您where python中获得的python.exe路径","-u","$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "encoding": "utf-8" ,
    "env": {"PYTHONIOENCODING": "utf8"}//通过这句,使编码一致,都是utf8
}

保存为python3

然后把编译系统换为python3。

开始测试

本次所用数据为达关杯文本分类的数据。

数据地址:https://pan.baidu.com/s/12B8VJhzMn1ou7eTfCwpwqQ

文件夹目录结构:

///////////////////////////

源码:

#导入需要用到的三个工具包
import pandas as pd, numpy as np 
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn import svm
#定义一个main函数
def main():
    f = open("data/train_set.csv")
    t = open("data/test_set.csv")
# f/t打开训练集与测试集数据
    train0 = []
    test0 = []
# 按行写入原始数据到train0/test0 并且去掉换行,以逗号为分隔符分开
    for line in f:
        train0.append(line.replace("\n","").split(","))
    for line in t:
        test0.append(line.replace("\n","").split(","))

    count = 0
    train = []
#设置train训练集的大小,截取了tarin0中少等于110000行存入train
    for tr in train0:
        if count > 110000:
            break
        else:
            train.append(tr)
        count = count+1

# 产生和训练集长度一样的随机数组
    rarray = np.random.random(size=len(train))
    train_set = []
    # train_tag = []
    test_set = []
    # test_tag = []
    #选取train中99%的数值存入train_set,1%的数值存入test_set
    i = 0
    for tr in train:
        if rarray[i] < 0.99:
            train_set.append(tr)
        else:
            test_set.append(tr)
        i = i+1
    # for i in range(len(train)):
    #     if rarray[i] < 0.8:
    #         train_set.append(train[i, :])
    #         # train_tag.append(labels[i])
    #     else:
    #         test_set.append(train[i, :])
    #         # test_tag.append(labels[i])
    #显式进行垃圾回收
    import gc
    del train
    gc.collect()

    train = []
    test = []
#去掉训练集和测试集的第一行(第一行为标题),并存入train/test
    train = pd.DataFrame(train_set[1:])
#为训练集赋予标题
    train.columns=['id','article','word_seg','class']
    test = pd.DataFrame(test_set[1:])
    test.columns = ['id','article','word_seg','class']
#把test的id列存入test_id
    test_id = test[["id"]].copy()
#输出train和test数组的维度
    print("train shape and valid shape:", train.shape, test.shape)
    test0 = pd.DataFrame(test0[1:])
    test0.columns = ['id', 'article', 'word_seg']
    test_id0 = test0[["id"]].copy()
    print("real test shape:", test0.shape)

    column = "word_seg"
    # train = pd.read_csv('data/train_set.csv')
    # test = pd.read_csv('data/test_set.csv')


    # test_id = test_set["id"].copy()
    #初始化TfidfVectorizer,
    vec = TfidfVectorizer(ngram_range=(1, 3), min_df=2, max_df=0.9, use_idf=1
                          , smooth_idf=1, sublinear_tf=1)
    #矩阵转化为TF-IDF(评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度)权重矩阵
    trn_term_doc = vec.fit_transform(train[column])
    test_term_doc = vec.transform(test[column])

    test0_term_doc = vec.transform(test0[column])

    fid0 = open('data/baseline.csv', 'w')

    train_tag = (train[["class"]]).astype(int) - 1
    test_tag = (test[["class"]]).astype(int) - 1
    from sklearn.neural_network import MLPClassifier
    # lin_clf = MLPClassifier(solver='lbfgs', alpha=1e-5,hidden_layer_sizes = (5, 2),
    #                     random_state = 1)
    lin_clf = svm.LinearSVC()
    #训练数据
    lin_clf.fit(trn_term_doc, train_tag)
    #预测数据
    preds = lin_clf.predict(test0_term_doc)

    train_pred = lin_clf.predict(trn_term_doc)
    test_pred = lin_clf.predict(test_term_doc)

    train_err_num, train_err_ratio = checkPred(train_tag.values, train_pred)
    test_err_num, test_err_ratio = checkPred(test_tag.values, test_pred)

    print('=== 分类训练完毕,分类结果如下 ===')
    print('训练集误差: {e}'.format(e=train_err_ratio))
    print('检验集误差: {e}'.format(e=test_err_ratio))

    i=0
    fid0.write("id,class"+"\n")
    for item in preds:
        fid0.write(str(i)+","+str(item+1)+"\n")
        i = i+1
    fid0.close()
#查看误差
def checkPred(data_tag, data_pred):
    if data_tag.__len__() != data_pred.__len__():
        raise RuntimeError('The length of data tag and data pred should be the same')
    err_count = 0
    for i in range(data_tag.__len__()):
        if data_tag[i]!=data_pred[i]:
            err_count += 1
    err_ratio = err_count / data_tag.__len__()
    return [err_count, err_ratio]
if __name__ == '__main__':
    main()

源码结束

/////////////

运行结果

猜你喜欢

转载自blog.csdn.net/houzi176/article/details/81532242