python進行文字分類,基於word2vec,sklearn-svm對微博性別分類
阿新 • • 發佈:2019-01-23
第一個分類任務,記錄一下
語料庫下載
一、進行手工分類
導師給的資料是兩個資料夾,一個包含了以使用者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))
結果如下: