python进行文本分类,基于word2vec,sklearn-svm对微博性别分类

第一个分类任务,记录一下
语料库下载

一、进行手工分类
导师给的数据是两个文件夹,一个包含了以用户ID名为标题的一大堆txt(未分类),还有一个文件夹里面是已经分类好的男女性别ID的集合txt。
python进行文本分类,基于word2vec,sklearn-svm对微博性别分类_第1张图片

python进行文本分类,基于word2vec,sklearn-svm对微博性别分类_第2张图片

先要做的任务就是将未分类的txt分成两类(根据给的已经分类的id集合txt),这个分为三步:
1、新建男女分类的空文件夹。
2、提取id集合中的id,存在两个list里面.
3、提取未分类txt的文件名,对它们进行分类,如果是女的,将其复制txt到女文件夹。否则放到男文件夹。
最后得到结果如下:
这里写图片描述

其中female 和male文件夹中是已经分类好的txt文件。

二、进行分词

利用Jieba分词和去除停用词(这里我用的是全模式分词),每一篇文档为一行 用换行拼接,得到result.txt

fobj = open(new_folder_path + '//' + file, 'r', encoding='utf-8')  # 打开样本
raw = fobj.read()  # 读样本
word_cut = jieba.cut(raw,cut_all=True)  # 对样本进行结巴分词
stopwords=stopwordslist('D:/pycharm/project1/tingyongci.txt')  # 这里加载停用词的路径

三、用gensim.word2vec得到词向量模型

对result.txt进行模型训练

如何使用word2vec见这篇文章

得到train.model(我用的维度50,min_count=1)

四、求和求平均得到文档向量
对每一篇文章的词向量进行求和,然后除以词数量,得到文档向量(维度为50的向量)。
其中70%划分到train_set,30%划分到test
利用numpy里面的sum函数对列求和

 a=np.sum(ce,axis=0)
 a.tolist()
 a=[i/number for i in a] #求平均值后的文档向量

五、利用sklearn-svm进行分类

输入的是训练数据和训练标签(对应每一个文档向量的类别标签),进行训练。
预测则输入测试数据,得到测试标签(即测试分类结果)
如下:

核函数为rbf的时候效果最好。


  clf=svm.SVC()
    train_data_x = [d for (d, c) in train_set]
    train_data_y = [c for (d, c) in train_set]
    test_data_x = [d  for (d, c) in test_set]
    test_data_y = [c for (d, c) in test_set]

print("开始训练")
    clf.fit(train_data_x,train_data_y)
    result=clf.predict(test_data_x)
    acc = accuracy_score(test_data_y,result)
    print(acc)
    print(classification_report(test_data_y, result,labels=class_list,target_names=class_name))

结果如下:
python进行文本分类,基于word2vec,sklearn-svm对微博性别分类_第3张图片

你可能感兴趣的:(机器学习)