第六章(1.8)自然語言處理實戰——Jieba中文分詞,WordEmbedding的概念和實現

一、 NLP 走近自然語言處理

  • 概念
    Natural Language Processing/Understanding,自然語言處理/理解
    日常對話、辦公寫作、上網瀏覽
    希望機器能像人一樣去理解,以人類自然語言爲載體的文本所包含的信息,並完成一些特定任務

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

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

二、NLP 使用jieba分詞處理文本,中文分詞,關鍵詞提取,詞性標註

  • https://github.com/fxsjy/jieba

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

2.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 .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 僅包括指定詞性的詞,默認值爲空,即不篩選

2.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

2.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。

2.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

2.6 詞性列表

  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'女人')
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) 

利用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。

五、中文自然語言處理分析

5.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 實例

5.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方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章