1. 程式人生 > >cnn、rnn實現中文文字分類(基於tensorflow)

cnn、rnn實現中文文字分類(基於tensorflow)


tensorflow版本:

  1. In[33]: tf.__version__
  2. Out[33]:'1.2.1'

首先是資料獲取:

  1. curl -O "http://thuctc.thunlp.org/source/THUCNews.zip"
資料主要是財經、彩票、房產、股票、家居等相關主題的資料 現在之後用unzip 解壓既可以,再抽取10個主題的資料,參考的部落格是每個主題抽取6500條資料,其中每個主題5000用於訓練,1000用於測試,500用於驗證

抽取資料的python程式碼如下,原部落格寫了個shell指令碼,我用python寫了個:

  1. import
    os
  2. import glob
  3. import shutil
  4. import random
  5. basepath="/Users/shuubiasahi/Desktop/THUCNews/"
  6. newpath="/Users/shuubiasahi/Desktop/tensorflow/text/"
  7. listpath=list(map(lambda x:basepath+str(x)+"/",list(filter(lambda x:not str(x).startswith("."),os.listdir(basepath)))))
  8. def copy(listpath,MAXCOUNT=6500):
  9. for path in listpath
    :
  10. newdir=newpath+ str(path).split("/")[-2]
  11. print(newdir)
  12. if not os.path.exists(newdir):
  13. os.mkdir(newdir)
  14. files=glob.glob(path+"*.txt")
  15. if len(files)<MAXCOUNT:
  16. resultlist=[]
  17. for i in range(MAXCOUNT):
  18. resultlist.append(random.choice(files))
  19. else:
  20. resultlist=random.sample(files,MAXCOUNT)
  21. for file in resultlist:
  22. shutil.copy(file,newdir)
  23. if __name__=='__main__':
  24. copy(listpath)
  25. print("抽取成功")

把資料整合到一個檔案裡面去,格式如下:

  1. 標籤+“\t”+實際文字內容
分為訓練集合測試集、驗證集合,涉及到程式碼如下:
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 將文字整合到 traintestval 三個檔案中
  5. """
  6. import os
  7. basepath="/Users/shuubiasahi/Desktop/tensorflow/text/"
  8. trainpath="/Users/shuubiasahi/Desktop/tensorflow/train/"
  9. def _read_file(filename):
  10. with open(filename,'r',encoding='utf-8') as f:
  11. """
  12. u3000中文全形下的空格
  13. """
  14. return f.read().replace('\n','').replace('\t','').replace('\u3000','')
  15. def save_file(dirname):
  16. """
  17. 將多個檔案整合並存到3個檔案中
  18. dirname:原資料目錄
  19. 檔案內容格式:類別\t內容
  20. """
  21. f_train=open(trainpath+"cnews.train.txt",'w',encoding='utf-8')
  22. f_test = open(trainpath +"cnews.test.txt",'w', encoding='utf-8')
  23. f_val = open(trainpath +"cnews.val.txt",'w', encoding='utf-8')
  24. for category in os.listdir(dirname):
  25. catdir=os.path.join(dirname,category)
  26. if not os.path.isdir(catdir):
  27. continue
  28. files=os.listdir(catdir)
  29. print(len(files))
  30. count=0
  31. for cur_file in files:
  32. filename=os.path.join(catdir,cur_file)
  33. content=_read_file(filename)
  34. if count<5000:
  35. f_train.write(category+"\t"+content+"\n")
  36. elif count<6000:
  37. f_test.write(category+"\t"+content+"\n")
  38. else:
  39. f_val.write(category +'\t'+ content +'\n')
  40. count+=1
  41. print("finish:",category)
  42. f_train.close()
  43. f_test.close()
  44. f_val.close()
  45. if __name__=='__main__':
  46. save_file(basepath)
  47. print(len(open(trainpath+"cnews.train.txt",'r', encoding='utf-8').readlines()))
  48. print(len(open(trainpath +"cnews.test.txt",'r', encoding='utf-8').readlines()))
  49. print(len(open(trainpath +"cnews.val.txt",'r', encoding='utf-8').readlines()))

預處理程式碼說明:

  1. read_file():讀取上一部分生成的資料檔案,將內容和標籤分開返回;
  2. _build_vocab():構建詞彙表,這裡不需要對文件進行分詞,單字的效果已經很好,這一函式會將詞彙表儲存下來,避免每一次重複處理;
  3. _read_vocab():讀取上一步儲存的詞彙表,轉換為{詞:id}表示;
  4. _read_category():將分類目錄固定,轉換為{類別: id}表示;
  5. _file_to_ids():基於上面定義的函式,將資料集從文字轉換為id表示;
  6. to_words():將一條由id表示的資料重新轉換為文字;
  7. preocess_file():一次性處理所有的資料並返回;
  8. batch_iter():為神經網路的訓練準備批次的資料。
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from collections importCounter
  4. import tensorflow.contrib.keras as kr
  5. import numpy as np
  6. import os
  7. trainpath="/Users/shuubiasahi/Desktop/tenso