因為工作中經常需要用到分詞這個步驟,覺得還蠻實用的,所以就總結分享了一下。如果有需要處理文本數據的同學,可以參考一下。
1.四種分詞模式(看一下實例效果的差別就可以理解了)
test = "據媒體近日報道,在高校網課繁榮的背后,隱藏著一條付費刷課產業鏈。在這條產業鏈上,有人開發軟件腳本,有人當起了代理,有人則提供手工刷單服務,而在一些電商平臺上,也能輕松購買到代刷網課服務……付費刷課已經成為一個參與面頗廣、影響甚眾的灰黑產業。近些年來,借助互聯網技術的快速發展,很多高校都推出了網課,這種不受時空限制的學習方式,受到學生普遍歡迎,尤其是疫情期間,網課對助力高校“停課不停學”發揮了不可替代的積極作用。但其背后存在的刷課現象也讓人觸目驚心。據警方通報,僅在2019年至2020年,全國范圍內購買刷課服務的學生就超過790萬人,刷課數量逾7900萬科次,涉事刷課平臺的下線代理人超過10萬人,其中大多數都是在校學生。代刷網課現象之所以猖獗,一方面源于一些學校對網課質量把控不嚴,大量“水課”充斥其間,很難調動學生上課的積極性, 另一方面則是因為網課的考核評價方式,對學生的自主性、自覺性提出了更高的要求。無論如何,這些都不該成為學生堂而皇之刷課的理由。刷課并非對抗“水課”的良策,更不是虛度光陰的擋箭牌。代刷網課不僅破壞正常教學秩序,敗壞學風考風,損害教育公平,而且刷課所形成的虛假數據,也會讓學校調整優化課程設置失去重要的參考依據。而警方對相關案件的查處則說明,代刷網課不僅有違公序良俗,而且還有可能觸碰法律紅線。"
seg_list1 = jieba.cut(test, cut_all=True) #全模式
"Full Mode: " + "/ ".join(seg_list1)
seg_list2 = jieba.cut(test, cut_all=False) # 精確模式
"Default_Mode: " + "/ ".join(seg_list2)
seg_list3 = jieba.cut_for_search(test) # 搜索引擎模式
"Search_Engine__Mode: " + "/ ".join(seg_list3)
全模式的結果
精確模式和搜索引起模式的結果2.載入自定義詞和去掉停用詞
#jieba.load_userdict("add_words_ch.txt") #載入自定義詞典,詞典根據經驗進行更新
#jieba.add_word("自定義詞")#只有一個詞時可以直接這樣加
#jieba.del_word(word) #也可以進行刪除
#比如在精確模式下對最前面的詞語添加不可替代之后,下面就可以識別出來了
jieba.add_word("不可替代")
seg_list4 = jieba.lcut(test,cut_all=False)
"Defalut Mode: " + '/'.join(seg_list4)
添加自定義詞語
stopwords=pd.read_csv('stop_words_ch.txt',header=None,quoting = csv.QUOTE_NONE,delimiter="\t") #導入停用詞
stopwords = stopwords[0].tolist() #將所有詞語轉換成一個列表
stopwords.append(' ') #添加去掉空格,如果有別的要去掉的,可以繼續添加,或者直接添加在文件里就可以
final_segment = [] #對分詞后的結果逐個檢查是否在停用詞列表中,若是在就過濾掉,最后獲得過濾后的結果
for word in seg_list4:
if word not in stopwords:
final_segment.append(word)
#這個只是粗略的用了我原有的詞庫,還沒有根據這個新聞更新新的停用詞或者是自定義詞庫
去除停用詞的效果
jieba.suggest_freq(("高校","網"),True) #這樣可以讓高校和網不被分到一起
jieba.suggest_freq("公序良俗",True) #這樣可以讓公序良俗分到一起
seg_list4 = jieba.lcut(test)
final_segment= []
for word in seg_list4:
if word not in stopwords:
final_segment.append(word)
'/'.join(final_segment)
示例3.對各個詞語進行統計和排序
# result = Counter(seg_list4)

result = pd.value_counts(seg_list4)
result.sort_values(ascending=False)
4.對關鍵詞進行提取通過TF-IDF算法,在之前分享貝葉斯部分的時候我們也提過TF-IDF算法,TF=在該文檔中出現的單詞次數/文檔的總單詞數分詞工具分好以后關鍵詞價格,而IDF=log(n(文檔總數)/詞出現的文檔數+1),則TF-IDF值為這兩個值相乘,即字詞的重要性隨著它在該文檔中出現的次數成正比增加(詞頻),但同時會隨著它在總文檔中出現的頻率成反比下降。
jieba.analyse.extract_tags(test, topK=20, withWeight=True, allowPOS=())
#關鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑
#jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑
#關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑
#jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑
TF-IDF
2.通過基于 算法的關鍵詞抽取(詳細算法內容看下面的鏈接)
jieba.analyse.textrank(test, topK=20, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v')) #直接使用,接口相同,注意默認過濾詞性。
兩種算法的結果比較5.詞性標記
jieba..(=None) 新建自定義分詞器, 參數可指定內部使用的 jieba. 分詞器。jieba..dt 為默認詞性標注分詞器。
import jieba.posseg as pseg
words = pseg.cut(test)
for word, flag in words:
print('%s %s' % (word, flag)) #結果圖就不Po了
詞性類別
詞云圖不怎么用到就先不弄了,等有常用到再來~~
(我安裝庫的時候老出錯,發現原來它不支持3.8版本,所以我就創建了個3.7的新環境分詞工具分好以后關鍵詞價格,然后激活這個環境,后面就可以下載了;但是下載-tiny的時候又出現錯誤,根據下面這個方法就解決了;記住下載-tiny==1.6.1 加了個鏡像(-i // ---host=),不然又容易出錯;但是 .fluid 的時候又出現了沒有goole模塊的錯誤,搞了半天這個錯誤還沒有解決嗚嗚,我打算下去再研究padle了討厭,解決了再來繼續分享!)