1. 如何利用python對中文進行分詞處理
python做中文分詞處理主要有以下幾種:結巴分詞、NLTK、THULAC
1、fxsjy/jieba
結巴的標語是:做最好的 Python 中文分片語件,或許從現在來看它沒做到最好,但是已經做到了使用的人最多。結巴分詞網上的學習資料和使用案例比較多,上手相對比較輕松,速度也比較快。
結巴的優點:
支持三種分詞模式
支持繁體分詞
支持自定義詞典
MIT 授權協議
2、THULAC:一個高效的中文詞法分析工具包
前兩天我在做有關於共享單車的用戶反饋分類,使用jieba分詞一直太過零散,分類分不好。後來江兄給我推薦了THULAC: 由清華大學自然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包 。THULAC的介面文檔很詳細,簡單易上手。
THULAC分詞的優點:
能力強。利用規模最大的人工分詞和詞性標注中文語料庫(約含5800萬字)訓練而成,模型標注能力強大。
准確率高。該工具包在標准數據集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標注的F1值可達到92.9%
速度較快。同時進行分詞和詞性標注速度為300KB/s,每秒可處理約15萬字。只進行分詞速度達到1.3MB/s,速度比jieba慢
Python 解決中文編碼問題基本可以用以下邏輯:
utf8(輸入) ——> unicode(處理) ——> (輸出)utf8
Python 裡面處理的字元都是都是unicode 編碼,因此解決編碼問題的方法是把輸入的文本(無論是什麼編碼)解碼為(decode)unicode編碼,然後輸出時再編碼(encode)成所需編碼。
由於處理的一般為txt 文檔,所以最簡單的方法,是把txt 文檔另存為utf-8 編碼,然後使用Python 處理的時候解碼為unicode(sometexts.decode('utf8')),輸出結果回txt 的時候再編碼成utf8(直接用str() 函數就可以了)。
2. python中怎樣處理漢語的同義詞用結巴分詞
python中文分詞:結巴分詞
中文分詞是中文文本處理的一個基礎性工作,結巴分詞利用進行中文分詞。其基本實現原理有三點:
基於Trie樹結構實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)
採用了動態規劃查找最大概率路徑, 找出基於詞頻的最大切分組合
對於未登錄詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi演算法
安裝(Linux環境)
下載工具包,解壓後進入目錄下,運行:python setup.py install
模式
默認模式,試圖將句子最精確地切開,適合文本分析
全模式,把句子中所有的可以成詞的詞語都掃描出來,適合搜索引擎
介面
組件只提供jieba.cut 方法用於分詞
cut方法接受兩個輸入參數:
第一個參數為需要分詞的字元串
cut_all參數用來控制分詞模式
待分詞的字元串可以是gbk字元串、utf-8字元串或者unicode
jieba.cut返回的結構是一個可迭代的generator,可以使用for循環來獲得分詞後得到的每一個詞語(unicode),也可以用list(jieba.cut(...))轉化為list
實例
#! -*- coding:utf-8 -*-
import jieba
seg_list = jieba.cut("我來到北京清華大學", cut_all = True)
print "Full Mode:", ' '.join(seg_list)
seg_list = jieba.cut("我來到北京清華大學")
print "Default Mode:", ' '.join(seg_list)
3. 如何用python和jieba分詞,統計詞頻
#!python3
#-*-coding:utf-8-*-
importos,codecs
importjieba
fromcollectionsimportCounter
defget_words(txt):
seg_list=jieba.cut(txt)
c=Counter()
forxinseg_list:
iflen(x)>1andx!=' ':
c[x]+=1
print('常用詞頻度統計結果')
for(k,v)inc.most_common(100):
print('%s%s%s%d'%(''*(5-len(k)),k,'*'*int(v/3),v))
if__name__=='__main__':
withcodecs.open('19d.txt','r','utf8')asf:
txt=f.read()
get_words(txt)
4. python3怎麼使用結巴分詞
下面這個程序是對一個文本文件里的內容進行分詞的程序:test.py
[python] view plain
#!/usr/bin/python
#-*-encoding:utf-8-*-
importjieba#導入jieba模塊
defsplitSentence(inputFile,outputFile):
fin=open(inputFile,'r')#以讀的方式打開文件
fout=open(outputFile,'w')#以寫得方式打開文件
foreachLineinfin:
line=eachLine.strip().decode('utf-8','ignore')#去除每行首尾可能出現的空格,並轉為Unicode進行處理
wordList=list(jieba.cut(line))#用結巴分詞,對每行內容進行分詞
outStr=''
forwordinwordList:
outStr+=word
outStr+='/'
fout.write(outStr.strip().encode('utf-8')+' ')#將分詞好的結果寫入到輸出文件
fin.close()
fout.close()
splitSentence('myInput.txt','myOutput.txt')
寫完程序之後,在Linux重點輸入:python test.py即可運行程序進行分詞。
輸入的文件內容如下所示:
注意:第11行的 jieba.cut()返回的結構是一個可迭代的generator,可以用list(jieba.cut(...))轉化為list
5. jieba分詞(R vs. python)
自然語言處理(NLP)是機器學習重要分支之一,主要應用於篇章理解、文本摘要、情感分析、知識圖譜、文本翻譯等領域。而NLP應用首先是對文本進行分詞,當前中文分詞器有Ansj、paoding、盤古分詞等多種,而最基礎的分詞器應該屬於jieba分詞器(比較見下圖)。
下面將分別應用R和python對jieba分詞器在中文分詞、詞性標注和關鍵詞提取領域的應用進行比較。
R實現
通過函數worker()來初始化分詞引擎,使用segment()進行分詞。有四種分詞模式:最大概率法(MP)、隱馬爾科夫模型(HMM)、混合模型(Mix)及索引模型(query),默認為混合模型。具體可查看help(worker).
#install.packages('jiebaR')library(jiebaR)mixseg <- worker()segment( "這是一段測試文本" , mixseg ) #或者用以下操作mixseg['這是一段測試文本']mixseg <= "這是一段測試文本"
python實現
python中需安裝jieba庫,運用jieba.cut實現分詞。cut_all參數為分詞類型,默認為精確模式。
import jiebaseg_list = jieba.cut(u"這是一段測試文本",cut_all = False)print("Full mode: "+ ",".join(seg_list)) #默認精確模式
無論是R還是python都為utf—8編碼。
R實現
可以使用<=.tagger 或者tag 來進行分詞和詞性標注,詞性標注使用混合模型模型分詞,標注採用和 ictclas 兼容的標記法。
words = "我愛北京天安門"tagger = worker("tag") #開啟詞性標注啟發器tagger <= words # r v ns ns # "我" "愛" "北京" "天安門"
python實現
#詞性標注import jieba.posseg as psegwords = pseg.cut("我愛北京天安門")for word,flag in words: print('%s, %s' %(word,flag))
R實現
R關鍵詞提取使用逆向文件頻率(IDF)文本語料庫,通過worker參數「keywords」開啟關鍵詞提取啟發器,topn參數為關鍵詞的個數。
keys = worker("keywords",topn = 5, idf = IDFPATH)keys <= "會議邀請到美國密歇根大學(University of Michigan, Ann Arbor)環境健康科學系副教授奚傳武博士作題為「Multibarrier approach for safe drinking waterin the US : Why it failed in Flint」的學術講座,介紹美國密歇根Flint市飲用水污染事故的發生發展和處置等方面內容。講座後各相關單位同志與奚傳武教授就生活飲用水在線監測系統、美國水污染事件的處置方式、生活飲用水老舊管網改造、如何有效減少消毒副產物以及美國涉水產品和二次供水單位的監管模式等問題進行了探討和交流。本次交流會是我市生活飲用水衛生管理工作洽商機制運行以來的又一次新嘗試,也為我市衛生計生綜合監督部門探索生活飲用水衛生安全管理模式及突發水污染事件的應對措施開拓了眼界和思路。"#結果:# 48.8677 23.4784 22.1402 20.326 18.5354 # "飲用水" "Flint" "衛生" "水污染" "生活"
python實現
python實現關鍵詞提取可運用TF-IDF方法和TextRank方法。allowPOS參數為限定范圍詞性類型。
#關鍵詞提取import jieba.analysecontent = u'會議邀請到美國密歇根大學(University of Michigan, Ann Arbor)環境健康科學系副教授奚傳武博士作題為「Multibarrier approach for safe drinking waterin the US : Why it failed in Flint」的學術講座,介紹美國密歇根Flint市飲用水污染事故的發生發展和處置等方面內容。講座後各相關單位同志與奚傳武教授就生活飲用水在線監測系統、美國水污染事件的處置方式、生活飲用水老舊管網改造、如何有效減少消毒副產物以及美國涉水產品和二次供水單位的監管模式等問題進行了探討和交流。本次交流會是我市生活飲用水衛生管理工作洽商機制運行以來的又一次新嘗試,也為我市衛生計生綜合監督部門探索生活飲用水衛生安全管理模式及突發水污染事件的應對措施開拓了眼界和思路。'#基於TF-IDFkeywords = jieba.analyse.extract_tags(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基於TF-IDF結果# 飲用水 0.448327672795# Flint 0.219353532163# 衛生 0.203120821773# 水污染 0.186477211628# 生活 0.170049997544
#基於TextRankkeywords = jieba.analyse.textrank(content,topK = 5,withWeight = True,allowPOS = ('n','nr','ns'))for item in keywords: print item[0],item[1] #基於TextRank結果:# 飲用水 1.0# 美國 0.570564785973# 奚傳武 0.510738424509# 單位 0.472841889334# 講座 0.443770732053
寫在文後
自然語言處理(NLP)在數據分析領域有其特殊的應用,在R中除了jiebaR包,中文分詞Rwordseg包也非常常用。一般的文本挖掘步驟包括:文本獲取(主要用網路爬取)——文本處理(分詞、詞性標注、刪除停用詞等)——文本分析(主題模型、情感分析)——分析可視化(詞雲、知識圖譜等)。本文是自然語言處理的第一篇,後續將分別總結下應用深度學習Word2vec進行詞嵌入以及主題模型、情感分析的常用NLP方法。
參考資料
Introction · jiebaR 中文分詞 https://qinwenfeng.com/jiebaR/segment.html
知乎:【文本分析】利用jiebaR進行中文分詞 https://zhuanlan.hu.com/p/24882048
雪晴數據網:全棧數據工程師養成攻略 http://www.xueqing.tv/course/73
搜狗實驗室,詞性標注應用 http://www.sogou.com/labs/webservice/
【R文本挖掘】中文分詞Rwordseg http://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/
6. 如何用python進行海量中文分詞
1、全局變數在函數中使用時需要加入global聲明
2、獲取網頁內容存入文件時的編碼為ascii進行正則匹配時需要decode為GB2312,當匹配到的中文寫入文件時需要encode成GB2312寫入文件。
3、中文字元匹配過濾正則表達式為ur'[\u4e00-\u9fa5]+',使用findall找到所有的中文字元存入分組
4、KEY,Value值可以使用dict存儲,排序後可以使用list存儲
5、字元串處理使用split分割,然後使用index截取字元串,判斷哪些是名詞和動詞
6、命令行使用需要導入os,os.system(cmd)
7. 用python怎麼能夠將一句中文分割為單個的字
字元串可以直接分片或者索引訪問,比如s[0]=我,s[-1]=做。等等肆鍵友。
如果是要轉成list,可以直亮指接構造,如: l=list('abc')或者l=list(s)
分詞需要相應的演算法和詞典支持。pymmseg-cpp是一個不錯的python中文分詞庫。你可以試試裂槐。
https://github.com/pluskid/pymmseg-cpp/