NLP自然語言處理 jieba中文分詞,關鍵詞提取,詞性標註,並行分詞,起止位置,文字挖掘,NLP WordEmbedding的概念和實現

大樹2發表於2017-11-02

1. NLP 走近自然語言處理

概念
Natural Language Processing/Understanding,自然語言處理/理解

日常對話、辦公寫作、上網瀏覽

希望機器能像人一樣去理解,以人類自然語言為載體的文字所包含的資訊,並完成一些特定任務

內容
中文分詞、詞性標註、命名實體識別、關係抽取、關鍵詞提取、資訊抽取、依存分析、詞嵌入……

應用
篇章理解、文字摘要、情感分析、知識圖譜、文字翻譯、問答系統、聊天機器人……


2. NLP 使用jieba分詞處理文字,中文分詞,關鍵詞提取,詞性標註

https://github.com/fxsjy/jieba

jieba:基於字首詞典進行詞圖掃描,構成全部可能分詞結果的有向無環圖,動態規劃查詢最大概率路徑

1. 中文分詞:jieba.cut
import jieba

seg_list = jieba.cut("我來到北京清華大學", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式

seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精確模式

seg_list = jieba.cut("他來到了網易杭研大廈") # 預設是精確模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造") # 搜尋引擎模式
print(", ".join(seg_list))

2 .關鍵詞提取:jieba.analyse.extract_tags
import jieba.analyse
基於TF-IDF:jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
基於TextRank:jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程式中動態修改詞典。
使用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。

sentence 為待提取的文字
topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
withWeight 為是否一併返回關鍵詞權重值,預設值為 False
allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選


3 .詞性標註:jieba.posseg.cut()

import jieba.posseg as pseg
words = pseg.cut("我愛北京天安門")
for word, flag in words:
print('%s, %s' % (word, flag))

我 r
愛 v
北京 ns
天安門 ns

4. 並行分詞

原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程式並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升
基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows
用法:
jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程式數
jieba.disable_parallel() # 關閉並行分詞模式
例子:https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py
實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程式版的 3.3 倍。
注意:並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。

5. Tokenize:返回詞語在原文的起止位置
注意,輸入引數只接受 unicode
預設模式
result = jieba.tokenize(u'永和服裝飾品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服裝 start: 2 end:4
word 飾品 start: 4 end:6
word 有限公司 start: 6 end:10

搜尋模式
result = jieba.tokenize(u'永和服裝飾品有限公司', mode='search')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服裝 start: 2 end:4
word 飾品 start: 4 end:6
word 有限 start: 6 end:8
word 公司 start: 8 end:10
word 有限公司 start: 6 end:10

Segmentation speed

1.5 MB / Second in Full Mode
400 KB / Second in Default Mode
Test Env: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《圍城》.txt

詞性列表
1. 名詞 (1個一類,7個二類,5個三類)
n 名詞
nr 人名
nr1 漢語姓氏
nr2 漢語名字
nrj 日語人名
nrf 音譯人名
ns 地名
nsf 音譯地名
nt 機構團體名
nz 其它專名
nl 名詞性慣用語
ng 名詞性語素

2. 時間詞(1個一類,1個二類)
t 時間詞
tg 時間詞性語素

3. 處所詞(1個一類)
s 處所詞 (家中、門外、境內、西方……)

4. 方位詞(1個一類)
f 方位詞

5. 動詞(1個一類,9個二類)
v 動詞
vd 副動詞
vn 名動詞
vshi 動詞“是”
vyou 動詞“有”
vf 趨向動詞
vx 形式動詞
vi 不及物動詞(內動詞)
vl 動詞性慣用語
vg 動詞性語素

6. 形容詞(1個一類,4個二類)
a 形容詞
ad 副形詞
an 名形詞
ag 形容詞性語素
al 形容詞性慣用語

7. 區別詞(1個一類,2個二類)
b 區別詞 (主要、整個、所有……)
bl 區別詞性慣用語

8. 狀態詞(1個一類)
z 狀態詞

9. 代詞(1個一類,4個二類,6個三類)
r 代詞
rr 人稱代詞
rz 指示代詞
rzt 時間指示代詞
rzs 處所指示代詞
rzv 謂詞性指示代詞
ry 疑問代詞
ryt 時間疑問代詞
rys 處所疑問代詞
ryv 謂詞性疑問代詞
rg 代詞性語素

10. 數詞(1個一類,1個二類)
m 數詞
mq 數量詞

11. 量詞(1個一類,2個二類)
q 量詞
qv 動量詞
qt 時量詞

12. 副詞(1個一類)
d 副詞

13. 介詞(1個一類,2個二類)
p 介詞
pba 介詞“把”
pbei 介詞“被”

14. 連詞(1個一類,1個二類)
c 連詞
cc 並列連詞

15. 助詞(1個一類,15個二類)
u 助詞
uzhe 著
ule 了 嘍
uguo 過
ude1 的 底
ude2 地
ude3 得
usuo 所
udeng 等 等等 云云
uyy 一樣 一般 似的 般
udh 的話
uls 來講 來說 而言 說來
uzhi 之
ulian 連 (“連小學生都會”)

16. 嘆詞(1個一類)
e 嘆詞

17. 語氣詞(1個一類)
y 語氣詞(delete yg)

18. 擬聲詞(1個一類)
o 擬聲詞

19. 字首(1個一類)
h 字首

20. 字尾(1個一類)
k 字尾

21. 字串(1個一類,2個二類)
x 字串
xx 非語素字
xu 網址URL

22. 標點符號(1個一類,16個二類)
w 標點符號
wkz 左括號,全形:( 〔 [ { 《 【 〖 〈 半形:( [ { <
wky 右括號,全形:) 〕 ] } 》 】 〗 〉 半形: ) ] { >
wyz 左引號,全形:“ ‘ 『
wyy 右引號,全形:” ’ 』
wj 句號,全形:。
ww 問號,全形:? 半形:?
wt 歎號,全形:! 半形:!
wd 逗號,全形:, 半形:,
wf 分號,全形:; 半形: ;
wn 頓號,全形:、
wm 冒號,全形:: 半形: :
ws 省略號,全形:…… …
wp 破折號,全形:—— -- ——- 半形:--- ----
wb 百分號千分號,全形:% ‰ 半形:%
wh 單位符號,全形:¥ $ £ ° ℃ 半形:$


文字挖掘主要有哪些功能

自然語言處理技術文字挖掘功能:
* 涉黃涉政檢測:對文字內容做涉黃涉政檢測,滿足相應政策要求;
* 垃圾評論過濾:在論壇發言或使用者評論中,過濾文字中的垃圾廣告,提升文字總體質量;
* 情感分析:對使用者評論等文字內容做情感分析,指導決策與運營;
* 自動標籤提取:自動提取文字重要內容生成關鍵性標籤,在此基礎之上擴充更多功能形式;
* 文字自動分類:通過對文字內容進行分析,給出文字所屬的類別和置信度,支援二級分類.


NLP WordEmbedding的概念和實現

背景
如何表示詞語所包含的語義?

蘋果?水果?Iphone?
蘋果、梨子,這兩個詞相關嗎?

語言的表示
符號主義:Bags-of-word,維度高、過於稀疏、缺乏語義、模型簡單
分散式表示:Word Embedding,維度低、更為稠密、包含語義、訓練複雜

Word Embedding
核心思想:語義相關的詞語,具有相似的上下文環境,例如, 蘋果和梨子
所做的事情:將每個詞語訓練成,詞向量

實踐
基於gensim包和中文維基語料
gensim:http://radimrehurek.com/gensim/models/word2vec.html
中文維基分詞語料:連結 https://pan.baidu.com/s/1qXKIPp6 密碼 kade

pip install gensim

# 載入包
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

# 訓練模型
sentences = LineSentence('wiki.zh.word.text')
model = Word2Vec(sentences, size=128, window=5, min_count=5, workers=4)

# 儲存模型
model.save('word_embedding_128')

# 載入模型
model = Word2Vec.load("word_embedding_128")

# 使用模型
items = model.most_similar(u'中國')
model.similarity(u'男人', u'女人')

 

demo 2017.11.29 by denny shenzhen

 

import sys
import jieba
import jieba.analyse
import jieba.posseg as posg


sentence=u'''深圳新聞網訊 10月30日,世界城市日——全球城市競爭力論壇在廣州舉行。會上,中國社科院財經戰略研究院和聯合國人類住區規劃署釋出了《全球城市競爭力報告2017-2018》(以下簡稱《報告》)。

《報告》稱,通過對全球1007個城市的“經濟競爭力”進行測度後,深圳在“經濟競爭力”這項評選中位於第六名。上海、廣州、北京分列全球第14、15、20名。

北上廣深,不僅有最繁華的建築群,最多元的包容性,同時也是很多人改變命運的圓夢場。“經濟競爭力”是對現有存量的排名,但對青年們來說,增量的部分(即未來)顯得更為重要。《報告》也提供了一個可供參考的指標——“可持續競爭力”,即在未來保持全球競爭力的可持續性。

在未來“可持續競爭力”排名上,除了北京高於“經濟競爭力”指標,其他幾座城市的可持續競爭力指標都低於其經濟競爭力排名,深圳全球排名第35位。

科技與金融正在主導全球經濟,佔據全球價值鏈的主要部分,尤其是資訊科技企業的影響力正變得越來越大。科技中心城市在全球城市體系中的地位不斷上升。

綜合2017年各城市所擁有最具價值品牌數量和近十年變化情況等因素,《報告》還提出了未來“新型全球城市”排名,在排名前50的城市當中,北京、深圳、上海、廣州皆在其列,而“新一線城市”中僅有杭州入圍。“未來的競爭將持續轉向以城市經濟為單元的競爭”,美國獨立經濟智庫米爾肯研究所亞洲中心研究部董事、總經理黃華躍說。(記者李佳佳'''
#kw=jieba.analyse.extract_tags(sentence,topK=20,withWeight=True,allowPOS=('n','nr','ns'))
# kw=jieba.analyse.textrank(sentence,topK=20,withWeight=True,allowPOS=('ns','n','vn','v'))
# for item in kw:
# print(item[0],item[1])

cixingDict = {
'n': '名詞','nr': '人名','nr1': '漢語姓氏','nr2': '漢語名字','nrj': '日語人名','nrf': '音譯人名','ns': '地名','nsf': '音譯地名',
'nt': '機構團體名','nz': '其它專名','nl': '名詞性慣用語','ng': '名詞性語素','t': '時間詞','tg': '時間詞性語素','s':'處所詞',
'f':'方位詞','v': '動詞','vd': '副動詞','vn': '名動詞','vshi': '動詞“是”','vyou': '動詞“有”','vf': '趨向動詞','vx': '形式動詞',
'vi': '不及物動詞(內動詞)','vl': '動詞性慣用語','vg': '動詞性語素','a': '形容詞','ad': '副形詞','an': '名形詞','ag': '形容詞性語素',
'al': '形容詞性慣用語','b': '區別詞 (主要、整個、所有……)','bl': '區別詞性慣用語','z': '狀態詞','r': '代詞','rr': '人稱代詞',
'rz': '指示代詞','rzt': '時間指示代詞','rzs': '處所指示代詞','rzv': '謂詞性指示代詞','ry': '疑問代詞','ryt': '時間疑問代詞',
'rys': '處所疑問代詞','ryv': '謂詞性疑問代詞','rg': '代詞性語素','m': '數詞','mq': '數量詞','q': '量詞','qv': '動量詞','qt': '時量詞',
'd':'副詞','p': '介詞','pba': '介詞“把”','pbei': '介詞“被”','c': '連詞','cc': '並列連詞','e':'嘆詞','y': '語氣詞',
'o': '擬聲詞','h': '字首','k': '字尾','x': '標點符號','xx': '非語素字','xu': '網址URL',
'u': '助詞',
'uzhe': '著',
'ule': ' 了 嘍',
'ul': '助詞',
'uj': '助詞2',
'uguo': '過',
'ude1': '的 底',
'ude2': '地',
'ude3': '得',
'usuo': '所',
'udeng': '等 等等 云云',
'uyy': '一樣 一般 似的 般',
'udh': '的話',
'uls': '來講 來說 而言 說來',
'uzhi': '之',
'ulian': '連 ',

'w': '標點符號2',
'wkz': '左括號,全形:( 〔 [ { 《 【 〖 〈 半形:( [ { <',
'wky': '右括號,全形:) 〕 ] } 》 】 〗 〉 半形: ) ] { >',
'wyz': '左引號,全形:『',
'wyy': '右引號,全形:"" 』',
'wj': '句號,全形:。',
'ww': '問號,全形:? 半形:?',
'wt': '歎號,全形:! 半形:!',
'wd': '逗號,全形:, 半形:',
'wf': '分號,全形:; 半形:',
'wn': '頓號,全形:、',
'wm': '冒號,全形:: 半形: ',
'ws': '省略號,全形:…… …',
'wp': '破折號,全形:—— -- ——- 半形:--- ----',
'wb': '百分號千分號,全形:% ‰ 半形:%',
'wh': '單位符號,全形:¥ $ £ ° ℃ 半形:$'
}

#seg_lig=jieba.cut('習平:擔當黨的崇高使命 矢志永遠奮鬥',cut_all=True)
#print("full_name"+ "/ ".join(seg_lig))

# seg_lig2=jieba.cut('習平:擔當黨的崇高使命 矢志永遠奮鬥',cut_all=False)
# for item in seg_lig2:
# print(item)
# print("default_name"+ "/ ".join(seg_lig2))

# seg_lig3=jieba.cut_for_search('平:擔當黨的崇高使命 矢志永遠奮鬥')
# print("search_name"+ ", ".join(seg_lig3))
#
# ci xing analysis
def cixingAnalysis(inputtxt):
word=posg.cut(inputtxt)
for work,flag in word:
try:
print(work,cixingDict[flag])
except KeyError as e:
print('except',e)

# ci xing tongji
def cixingTongji(inputtxt):
word=posg.cut(inputtxt)
n_type={}

for work,flag in word:
if flag not in n_type:
n_type[flag] = 1
else:
n_type[flag] += 1

sorted(n_type.items(),key=lambda d:d[1],reverse=False)
print(n_type)

cixingAnalysis(sentence)
cixingTongji(sentence)


 

demo :

利用HMM進行詞性標註

隱馬爾科夫模型(HMM)是什麼?說白了,就是一個數學模型,用一堆數學符號和參數列示而已,包括隱藏狀態集合、觀察符號集合、初始概率向量pi, 狀態轉移矩陣A,混淆矩陣B。
  隱馬爾科夫模型(HMM)的三大基本問題與解決方案包括:
  1. 對於一個觀察序列匹配最可能的系統——評估,使用前向演算法(forward algorithm)解決;
  2. 對於已生成的一個觀察序列,確定最可能的隱藏狀態序列——解碼,使用維特比演算法(Viterbi algorithm)解決;
  3. 對於已生成的觀察序列,決定最可能的模型引數——學習,使用前向-後向演算法(forward-backward algorithm)解決。

可以解釋為:
  1、對詞性標註問題進行提煉:詞性標註本質上是一個分類問題,對於句子中的每一個單詞W,找到一個合適的詞類類別T,也就是詞性標記,不過詞性標註考慮的是整體標記的好壞,既整個句子的序列標記問題;
  2、抽象為數學模型:對於分類問題,有很多現成的數學模型和框架可以套用,譬如HMM、最大熵模型、條件隨機場、SVM等等;
  3、求出模型的解:上述模型和框架一旦可以套用,如何求解就基本確定好了,就像HMM中不僅描述了三大基本問題,並相應的給出了求解方案一樣;
  4、驗證模型的合理性:就是詞性標註的準確率等評測指標了,在自然語言處理中屬於必不可少的評測環節;
  5、解釋現實問題:如果詞性標註的各項指標夠好,就可以利用該數學模型構造一個詞性標註器來解決某種語言的標註問題了!
  詞性標註的數學建模就這樣了,自然語言處理中的多數分類問題與此相似。這裡講得是HMM的應用,所以其他模型暫且不表,以後有機會有條件了我們再說。


word2vec
使用word2vec訓練一個高質量的同義詞庫將"非標準表述" 對映到 "標準表述",這就是Synonyms的起源.

 

 

文字進行分詞:jieba.cut(line.strip(),cut_all = False)
統計 詞頻:jieba.lcut(line.strip(),cut_all = False)
動態調整詞典:jieba.suggest_freq(segment,tune=True)可以調節每個單個詞語的詞頻,使其能/不能被分出來。
jieba.suggest_freq(('中','將'),tune=True) #True表示希望分出來,False表示不希望分出來。


Facebook FastText:模型簡單,訓練速度非常快
fasttext是facebook開源的一個詞向量與文字分類工具
就是把文件中所有詞通過lookup table變成向量,取平均後直接用線性分類器得到分類結果

對比gensim的word2vec word2vec&doc2vec詞向量模型
作為一個處理可變長度文字的總結性方法,Quoc Le 和 Tomas Mikolov 提出了 Doc2Vec方法。除了增加一個段落向量以外,這個方法幾乎等同於 Word2Vec。

 

中文自然語言處理分析

1.關鍵詞提取

基於 TF-IDF 演算法的關鍵詞抽取:特徵選取
•jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())◾sentence 為待提取的文字
◾topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
◾withWeight 為是否一併返回關鍵詞權重值,預設值為 False
◾allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選

基於 TextRank 演算法的關鍵詞抽取:從本篇文件中提取關鍵詞
•jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,介面相同,注意預設過濾詞性。
•jieba.analyse.TextRank() 新建自定義 TextRank 例項


2.LDA主題模型
.載入停用詞
.轉換成合適的格式
.詞袋模型dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]

.LDA建模lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
print lda.print_topic(3, topn=5)
處理可變長度文字的總結性方法 Doc2Vec方法


用深度學習做文字分類:

1.CNN做文字分類

2 LSTM:long short term memory 捕捉時序資訊的長短時記憶神經網路

3.GRU分類器

相關文章