1. 程式人生 > >python進行文字分類,基於word2vec,sklearn-svm對微博性別分類

python進行文字分類,基於word2vec,sklearn-svm對微博性別分類

第一個分類任務,記錄一下
語料庫下載

一、進行手工分類
導師給的資料是兩個資料夾,一個包含了以使用者ID名為標題的一大堆txt(未分類),還有一個資料夾裡面是已經分類好的男女性別ID的集合txt。
這裡寫圖片描述

這裡寫圖片描述

先要做的任務就是將未分類的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進行模型訓練

得到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))

結果如下:
這裡寫圖片描述