這幾天公司需求,要做文本分類,看了些文章,各種機器學習、神經網絡,看不懂。自己結合結巴分詞做了個簡單的文本分類實現功能,總體來說還可以。
運行結果:
自己寫的,咋方便咋來,反正各種半自動,沒怎麼注重過程,小夥伴看了之後可以自己改一下,讓它更便捷。
首先要有數據,我是爬的各種新聞網站,得到的各類數據。
有了數據之後,就可以寫這次的代碼了
首先是訓練數據,通俗來說就是把文章處理成想要的格式。
第一部分代碼,目的是把文章取出來,然後結巴分詞之後再存起來:
import jieba
import os
file_dir = 'D:\新聞數據\娛樂'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
for x in files:
try:
path = root + '\\' + x
print(path)
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
#沒有stopwords的去網上下載好了,這個是停用詞,用來去掉那些沒有意義的詞語的
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
#去掉長度小於2的詞,因爲一個字的詞,意義不太大,當然不想去掉也無所謂
if len(x)>=2:
if x not in stopwords:
with open("D:\處理新聞數據\娛樂.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
print(x)
except:
pass
別忘了自己建個存數據的文件夾,我的是把處理後的數據放到了‘D:\處理新聞數據\娛樂.txt’
然後。。。。嘿嘿,半自動嘛,上面的代碼換啊,娛樂換成財經、彩票、房產啊啥的。。對應的存儲位置也換成財經、彩票、房產啊啥的。下圖我處理好存的樣子,帶_key的先忽略,還沒走到這一步,所以你的文件夾下還沒有
打開娛樂.txt看看,就是下圖這個樣子了,這個娛樂.txt裏面存儲了咱們從娛樂文件夾下拿到的所有娛樂文章分詞後的結果。這裏要注意的是,文章不要太多了,不然娛樂.txt文件會很大。我的是這麼大,再大的話待會運行程序打開它的時候,程序會報內存不足的錯誤,所以還是不要爬下來太多的文章,幾千條就行了
這樣一來,娛樂相關的文章都分詞完成,並且存到一個txt文件了。
有的同學說,我不想改一下運行一下,好幾個文件夾,好麻煩。
好吧,拿去:
做好電腦cpu跑滿的準備,會很卡哦,反正我的電腦很垃圾。
怕的話也可以一次少跑幾個,我寫的是六個,你可以寫三個嘛
#encoding=gbk
import jieba
import os
from multiprocessing import Process
def shehui():
file_dir = 'D:\新聞數據\社會'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num=0
for x in files:
num+=1
print(file_dir,num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x)>=2:
if x not in stopwords:
with open("D:\處理新聞數據\社會.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
def shishang():
file_dir = 'D:\新聞數據\時尚'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num = 0
for x in files:
num += 1
print(file_dir, num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x)>=2:
if x not in stopwords:
with open("D:\處理新聞數據\時尚.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
def shizheng():
file_dir = 'D:\新聞數據\時政'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num = 0
for x in files:
num += 1
print(file_dir, num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x)>=2:
if x not in stopwords:
with open("D:\處理新聞數據\時政.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
def tiyu():
file_dir = 'D:\新聞數據\體育'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num = 0
for x in files:
num += 1
print(file_dir, num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x) >= 2:
if x not in stopwords:
with open("D:\處理新聞數據\體育.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
def xingzuo():
file_dir = 'D:\新聞數據\星座'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num = 0
for x in files:
num += 1
print(file_dir, num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x) >= 2:
if x not in stopwords:
with open("D:\處理新聞數據\星座.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
def youxi():
file_dir = 'D:\新聞數據\遊戲'
for root, dirs, files in os.walk(file_dir):
# print(root) # 當前目錄路徑
# print(dirs) # 當前路徑下所有子目錄
# print(files) # 當前路徑下所有非目錄子文件
num = 0
for x in files:
num += 1
print(file_dir, num)
try:
path = root + '\\' + x
with open(path, "r+", encoding="utf-8") as f:
content = f.read().replace('\n', '')
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
# 全模式
test1 = jieba.cut(content, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x) >= 2:
if x not in stopwords:
with open("D:\處理新聞數據\遊戲.txt", "a+", encoding="utf-8") as f:
f.write(x + ",")
except:
pass
if __name__=='__main__':
p1=Process(target=shehui)
p2=Process(target=shishang)
p3=Process(target=shizheng)
p4=Process(target=tiyu)
p5 = Process(target=xingzuo)
p6 = Process(target=youxi)
# 運行多進程, 執行任務
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
# 等待所有的子進程執行結束, 再執行主進程的內容
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
p6.join()
這樣一來,你的‘D:\處理新聞數據’文件夾下面就有六個各類的文件了
ok,文章處理圓滿完成
進入下一個階段。這個階段就是要分析前面第一階段整好的那些個txt了。那些txt裏存的是各領域的相關文章分詞後的結果,也就是說比如你有10篇娛樂方面的文章,那個娛樂.txt裏存的就是這10篇文章被分詞之後的結果。這樣一來,我們通過計算這個娛樂.txt文件裏哪些詞出現的次數多,就說明娛樂類文章裏面比較喜歡用這種詞語,爲了好記,我們把它叫做。。娛樂用詞(我自己編的名字啊)。那麼,我們把這些詞語提取出來,存起來。等到以後我們碰到另一篇文章,咱們把這篇文章咔咔咔,分詞了,然後用這篇文章裏面的詞跟咱們之前存的娛樂用詞對比,如果這篇文章裏很多詞語都是用的娛樂用詞,那咱們就說它是娛樂類文章
這段話有點長,不懂得多看幾遍,這裏也是這套代碼的核心思路。
理解了之後,上代碼:
#我們把娛樂.txt取出來
with open('D:\處理新聞數據\娛樂.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出所有詞語出現的次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
#我們把count 這個字典裏存的所有value值拿出來,扔到value_list列表裏
value_list=[]
for key, value in count.items():
value_list.append(value)
#然後對列表開始操作
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前35個
ten_list=value_list[0:35]
#這35個就是最大的value值了,也就是所有詞語裏面,出現次數最多的前35個詞語的次數
print(ten_list)
#光知道詞語出現的次數不行啊,我們要的是這35個詞語是誰:
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\娛樂_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
這時候我們就把娛樂領域那麼多文章裏,出現次數最多的35個詞語拿出來了,存放在另一個txt文件裏,叫做娛樂_key.txt。這個35是我自己寫的啊,不固定,自己可以打印幾次,找最合適的數量出來。這個數量取多了,那些娛樂用詞就不那麼準了。取少了的話,會導致後面我們用這幾個詞跟別的文章匹配的時候,匹配機會也少了。打個比方,你就取了一個詞,叫。。‘明星‘,後來你用它跟另一篇娛樂類文章匹配,但是這篇文章裏就沒提到明星,你就說這篇文章不是娛樂類文章,豈不是出錯了。
眼(tou)尖(lan)的同學又看出來了,我上面這部分代碼還是要運行一次,改一下文件名,才能生成對應的key文件。
好吧,給你,跟上一個多進程一樣的嘛:
from multiprocessing import Process
def shehui():
with open('D:\處理新聞數據\社會.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:20]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\社會_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
def shishang():
with open('D:\處理新聞數據\時尚.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:35]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\時尚_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
def shizheng():
with open('D:\處理新聞數據\時政.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:35]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\時政_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
def tiyu():
with open('D:\處理新聞數據\體育.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:35]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\體育_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
def xingzuo():
with open('D:\處理新聞數據\星座.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:35]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\星座_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
def youxi():
with open('D:\處理新聞數據\遊戲.txt', encoding='utf8') as f:
content = f.read()
data = content[:-1].split(',')
#計算出各詞出現次數
count = {}
for character in data:
count.setdefault(character, 0)
count[character] = count[character] + 1
value_list=[]
for key, value in count.items():
value_list.append(value)
#從小到大排序
value_list.sort()
#反轉,從大到小
value_list.reverse()
#取前15個
ten_list=value_list[0:35]
print(ten_list)
for key, value in count.items():
if value in ten_list:
with open("D:\處理新聞數據\遊戲_key.txt", "a+", encoding="utf-8") as f:
f.write(key+ ",")
print(key)
if __name__=='__main__':
p1=Process(target=shehui)
p2=Process(target=shishang)
p3=Process(target=shizheng)
p4=Process(target=tiyu)
p5 = Process(target=xingzuo)
p6 = Process(target=youxi)
# 運行多進程, 執行任務
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
# 等待所有的子進程執行結束, 再執行主進程的內容
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
p6.join()
此時我們第二階段,取出娛樂用詞,財經用詞,體育用詞,各種用詞的環節就結束了,接下來就是找一篇文章,然後咔咔咔,分屍了。。分詞了,然後,跟咱們的各種詞對比,猜測他是哪一類文章了。
上代碼:
根據自己的分類進行增刪就好了。然後去各類新聞網站複製各種類別的文章放到測試.txt文件裏,運行,看看程序能不能猜得出來你複製的是哪一類文章。
#encoding=gbk
from jieba.analyse import *
import jieba
import os
#讀取測試文章
with open('測試.txt',encoding='utf8') as f:
data = f.read()
#讀取各類別的關鍵詞
with open('D:\處理新聞數據\財經_key.txt',encoding='utf8') as f:
data_caijing = f.read()[:-1].split(',')
with open('D:\處理新聞數據\彩票_key.txt',encoding='utf8') as f:
data_caipiao= f.read()[:-1].split(',')
with open('D:\處理新聞數據\房產_key.txt',encoding='utf8') as f:
data_fangcan = f.read()[:-1].split(',')
with open('D:\處理新聞數據\股票_key.txt',encoding='utf8') as f:
data_gupiao = f.read()[:-1].split(',')
with open('D:\處理新聞數據\家居_key.txt',encoding='utf8') as f:
data_jiaju = f.read()[:-1].split(',')
with open('D:\處理新聞數據\教育_key.txt',encoding='utf8') as f:
data_jiaoyu = f.read()[:-1].split(',')
with open('D:\處理新聞數據\科技_key.txt',encoding='utf8') as f:
data_keji= f.read()[:-1].split(',')
with open('D:\處理新聞數據\社會_key.txt',encoding='utf8') as f:
data_shehui = f.read()[:-1].split(',')
with open('D:\處理新聞數據\時尚_key.txt',encoding='utf8') as f:
data_shishang = f.read()[:-1].split(',')
with open('D:\處理新聞數據\時政_key.txt',encoding='utf8') as f:
data_shizheng= f.read()[:-1].split(',')
with open('D:\處理新聞數據\體育_key.txt',encoding='utf8') as f:
data_tiyu = f.read()[:-1].split(',')
with open('D:\處理新聞數據\星座_key.txt',encoding='utf8') as f:
data_xingzuo = f.read()[:-1].split(',')
with open('D:\處理新聞數據\遊戲_key.txt',encoding='utf8') as f:
data_youxi= f.read()[:-1].split(',')
with open('D:\處理新聞數據\娛樂_key.txt',encoding='utf8') as f:
data_yule = f.read()[:-1].split(',')
#定義空列表,待會存入和測試集相同的關鍵詞
caijing_list=[]
caipiao_list=[]
fangcan_list=[]
gupiao_list=[]
jiaju_list=[]
jiaoyu_list=[]
keji_list=[]
shehui_list=[]
shishang_list=[]
shizheng_list=[]
tiyu_list=[]
xingzuo_list=[]
youxi_list=[]
yule_list=[]
# 加載停用詞
stopwords = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
#分詞,取出測試數據的關鍵詞並判斷這些關鍵詞都在哪些類別的關鍵詞文件內存在,然後把這些詞存到對應的列表中
test1 = jieba.cut(data, cut_all=True)
list_test1 = list(test1)
for x in list_test1:
if len(x) >= 2:
if x not in stopwords:
if x in data_keji:
print(x,'在科技')
keji_list.append(x)
if x in data_tiyu:
print(x, '在體育')
tiyu_list.append(x)
if x in data_caijing:
print(x, '在財經')
caijing_list.append(x)
if x in data_caipiao:
print(x, '在彩票')
caipiao_list.append(x)
if x in data_fangcan:
print(x, '在房產')
fangcan_list.append(x)
if x in data_gupiao:
print(x, '在股票')
gupiao_list.append(x)
if x in data_jiaju:
print(x, '在家居')
jiaju_list.append(x)
if x in data_jiaoyu:
print(x, '在教育')
jiaoyu_list.append(x)
if x in data_shehui:
print(x, '在社會')
shehui_list.append(x)
if x in data_shishang:
print(x, '在時尚')
shishang_list.append(x)
if x in data_shizheng:
print(x, '在時政')
shizheng_list.append(x)
if x in data_xingzuo:
print(x, '在星座')
xingzuo_list.append(x)
if x in data_youxi:
print(x, '在遊戲')
youxi_list.append(x)
if x in data_yule:
print(x, '在娛樂')
yule_list.append(x)
# len(keji_list):這樣可以知道咱們的測試文章裏的詞語,有多少跟科技相關
# dic1['科技']=len_keji: 組成鍵值對放入字典中
#建一個空字典
dic1={}
len_keji=len(keji_list)
dic1['科技']=len_keji
len_tiyu=len(tiyu_list)
dic1['體育']=len_tiyu
len_caijing=len(caijing_list)
dic1['財經']=len_caijing
len_caipiao=len(caipiao_list)
dic1['彩票']=len_caipiao
len_fangcan=len(fangcan_list)
dic1['房產']=len_fangcan
len_gupiao=len(gupiao_list)
dic1['股票']=len_gupiao
len_jiaju=len(jiaju_list)
dic1['家居']=len_jiaju
len_jiaoyu=len(jiaoyu_list)
dic1['教育']=len_jiaoyu
len_shehui=len(shehui_list)
dic1['社會']=len_shehui
len_shishang=len(shishang_list)
dic1['時尚']=len_shishang
len_shizheng=len(shizheng_list)
dic1['時政']=len_shizheng
len_xingzuo=len(xingzuo_list)
dic1['星座']=len_xingzuo
len_youxi=len(youxi_list)
dic1['遊戲']=len_youxi
len_yule=len(yule_list)
dic1['娛樂']=len_yule
print(dic1)
#找出value值最大的,那麼也就是說,對應的該類別在測試文章裏出現的次數最多,就可以猜測,這篇文章就是該類別文章
for key,value in dic1.items():
if(value == max(dic1.values()))and value!=0:
print(key,value)
if key=='科技':
print('這篇文章分類應該是科技')
if key=='體育':
print('這篇文章分類應該是體育')
if key == '財經':
print('這篇文章分類應該是財經')
if key=='彩票':
print('這篇文章分類應該是彩票')
if key=='房產':
print('這篇文章分類應該是房產')
if key=='股票':
print('這篇文章分類應該是股票')
if key=='家居':
print('這篇文章分類應該是家居')
if key=='教育':
print('這篇文章分類應該是教育')
if key=='社會':
print('這篇文章分類應該是社會')
if key=='時尚':
print('這篇文章分類應該是時尚')
if key=='時政':
print('這篇文章分類應該是時政')
if key=='星座':
print('這篇文章分類應該是星座')
if key=='遊戲':
print('這篇文章分類應該是遊戲')
if key == '娛樂':
print('這篇文章分類應該是娛樂')
else:
pass
運行結果:
先複製一篇科技類的
再來一篇娛樂類
經過我的測試,結果還可以
所用訓練文章的不同和多少,會影響最終的預測結果。我這邊的股票和科技類的文章,預測準確率要低得多
下班了,明天把看的fasttest的理解發出來,共同學習。
有建議或意見的小夥伴,歡迎留言