回顧-AI全棧成長計劃-AI應用篇,—自然語言處理
神經網絡語言模型發展
語言模型
NLP里面做預訓練一般的選擇是用語言模型任務來做。
語言模型就是用來計算一個句子的概率的模型,也就是判斷一句話是否是人說出來的自然句子的概率。
語言模型包括文法語言模型和統計語言模型,我們一般使用統計語言模型。常見的統計語言模型有N元文法模型(N-gram Model)。
語言模型可以捕捉到詞的上下文信息。
詞向量(word embedding)
詞向量是為了解決自然語言處理領域的文字信息表示問題。在圖像領域,使用圖片的像素構成的矩陣展平成 vector 作為神經網絡的輸入;在語音領域,用音頻頻譜序列向量構成的矩陣作為神經網絡的輸入;在自然語言處理領域,將每個詞映射成一個向量編碼,作為神經網絡的輸入。
詞向量的核心問題是上下文與目標詞之間的關系建模。比較熱門的使用語言模型做 Word Embedding 的工具有 Word2Vec 和 Glove。
ELMO
由于Word Embedding無法解決多義詞問題,Word Embedding本質是一個靜態的方式,不會根據上下文的改變而變化。所以引出ELMO(Embedding from Language Models),ELMO提供了一種簡潔優雅的解決方案。
ELMO的本質思想是:事先用語言模型學好一個單詞的 Word Embedding,此時多義詞無法區分,在實際使用 Word Embedding 的時候,單詞已經具備了特定的上下文,這個時候可以根據上下文單詞的語義去調整單詞的 Word Embedding 表示,這樣經過調整后的 Word Embedding 更能表達在這個上下文中的具體含義。所以 ELMO 本身是個根據當前上下文對 Word Embedding 動態調整的思路。
ELMO 采用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在做下游任務時,從預訓練網絡中提取對應單詞的網絡各層的 Word Embedding 作為新特征補充到下游任務中。
GPT
GPT(Generative Pre-Training),其含義是指的生成式的預訓練。
與 ELMO 類似,GPT也采用兩階段過程,第一個階段是利用語言模型進行預訓練,第二階段通過 Fine-tuning 的模式解決下游任務。
GPT 的預訓練雖然仍然是以語言模型作為目標任務,但是采用的是單向的語言模型,單向的含義是指:只使用單詞的上文來進行預測,而拋開了下文。因此也限制了其在更多應用場景的效果,比如閱讀理解這種任務,在做任務的時候是可以允許同時看到上文和下文一起做決策的。
NNLM
NNLM(神經網絡語言模型),通過為每個單詞學習一個分布式表征來實現在連續空間上的建模。
第一個 NNLM——前饋神經網絡語言模型(FFNNLM)由 Bengio 等人于 2003 年提出,其性能要優于 N 元語言模型。隨后,Mikolov 等人于 2010 年提出了 RNN 語言模型(RNNLM)。從那時起,NNLM 逐漸成為了主流的語言模型,并得到了迅速發展。
2012 年,Sundermeyer 等人提出了長短期記憶循環神經網絡語言模型(LSTM-RNNLM)用于解決學習長期依賴的問題。為了降低訓練、評估以及 PPL 的開銷,人們提出了各種各樣的改進方案,例如分層的 Softmax、緩存模型等。近年來,為了改進 NNLM,人們引入了注意力機制(Attention),取得了顯著的性能提升。
Transformer
Transformer 是個疊加的自注意力機制(Self Attention)構成的深度網絡,是目前NLP里最強的特征提取器。Transformer 的結構由 encoder(編碼)和 decoder(解碼)組成。Transformer 詳見論文《Attention is all you need》。
語料
人工智能的核心在于數據支持。對AI有一些接觸之后,我們可以知道,無論模型性能再高,都離不開大量數據作為基礎。
業務提供的已有語料
國內外標準開放數據集
通過爬蟲抓取網絡數據(合法情況下)
在獲取語料的基礎上,另一個重要的步驟是語料的預處理。語料的質量直接影響模型的訓練性能,噪聲很大、與任務無關的語料需要進過一系列預處理工作才可以被使用。在一個完整的中文自然語言處理工程應用中,語料預處理大概會占到50%-70%的工作量。
常用的語料預處理方式包括:去除不規則符號及格式,人工去重、對齊、刪除和標注等,或者規則提取內容、正則表達式匹配、根據詞性和命名實體提取、編寫腳本或者代碼批處理等。
實驗環境準備
具體操作步驟:
登陸ModelArts控制臺https://www.huaweicloud.com/product/modelarts.html -> 開發環境 -> Notebook -> 創建
名稱 ? ? 自定義
工作環境 ? ? Python3
資源池 ? ? 選擇\"公共資源池\"即可
類型 ? ? GPU
規格 ? ? [限時免費]體驗規格GPU版或算力更好的計費版本
存儲配置 ? ? EVS
磁盤規格 ? ? 5GB
創建Notebook
可以選擇免費的版本,但是免費的要排隊哦~點擊下一步
創建步驟我就直接省略了,直接啟動以及創建好的,初次創建只要選擇好GPU一般都不會出現什么問題,如果選擇cpu可能會出現內存耗盡的問題,所以建議選擇GPU~
點擊打開后,點擊右上角的"New",然后創建TensorFlow-1.13.1開發環境
點擊左上方的文件名"Untitled",并輸入一個與本實驗相關的名稱,自定義
在Notebook中,我們輸入一個簡單的打印語句,然后點擊上方的運行按鈕,可以查看語句執行的結果:"如果未輸出結果,則環境還沒準備好,稍等一下在試試,還不能輸出結果,則重新創建環境
實驗環境準備好,那就進行下一步
# 導入jieba import jieba print("jieba導入成功")
待分詞語句1:明天我要去五棵松體育場打籃球
待分詞語句2:華為聯手中國電信,完成了武漢火神山醫院首個遠程會診平臺的網絡鋪設和設備調試
jieba.cut,當cut_all=True時,為全模式
# 待分詞語句 seg_text_1 = "明天我要去五棵松體育場打籃球" seg_text_2 = "華為聯手中國電信,完成了武漢火神山醫院首個遠程會診平臺的網絡鋪設和設備調試" print("待分詞語句1:" + seg_text_1) print("\n待分詞語句2:" + seg_text_2)
# 全模式 seg_1_1 = jieba.cut(seg_text_1, cut_all=True) seg_1_2 = jieba.cut(seg_text_2, cut_all=True) print("全模式1:" + "/ ".join(seg_1_1)) print("\n全模式2:" + "/ ".join(seg_1_2))
# 精確模式 seg_2_1 = jieba.cut(seg_text_1, cut_all=False) seg_2_2 = jieba.cut(seg_text_2, cut_all=False) print("精確模式1:" + "/ ".join(seg_2_1)) print("\n精確模式2:" + "/ ".join(seg_2_2))
# 搜索引擎模式 seg_3_1 = jieba.cut_for_search(seg_text_1) seg_3_2 = jieba.cut_for_search(seg_text_2) print("搜索引擎模式1:" + "/ ".join(seg_3_1)) print("\n搜索引擎模式2:" + "/ ".join(seg_3_2))
# 返回全模式列表 seg_4_1 = jieba.lcut(seg_text_1, cut_all=True) seg_4_2 = jieba.lcut(seg_text_2, cut_all=True) print("返回全模式列表1:{0}".format(seg_4_1)) print("\n返回全模式列表2:{0}".format(seg_4_2))
# 返回精確模式列表 seg_5_1 = jieba.lcut(seg_text_1, cut_all=False) seg_5_2 = jieba.lcut(seg_text_2, cut_all=False) print("返回精確模式列表1:{0}".format(seg_5_1)) print("\n返回精確模式列表2:{0}".format(seg_5_2))
關鍵詞提取
from jieba import analyse # 原始文本 anal_text = "天安門廣場,位于北京市中心,地處北京市東城區東長安街,北起天安門,南至正陽門,東起中國國家博物館,西至人民大會堂,南北長880米,東西寬500米,面積達44萬平方米,可容納100萬人舉行盛大集會,是世界上最大的城市廣場。廣場地面全部由經過特殊工藝技術處理的淺色花崗巖條石鋪成,中央矗立著人民英雄紀念碑和莊嚴肅穆的毛主席紀念堂,天安門兩邊是勞動人民文化宮和中山公園,與天安門渾然一體,共同構成天安門廣場。" print("文本:", anal_text)
# 引入TF-IDF關鍵詞抽取接口 tfidf = analyse.extract_tags print("TF-IDF算法提取的20個關鍵詞:\n") # 基于TF-IDF算法進行關鍵詞抽取 for x, w in tfidf(anal_text, withWeight=True): print('%s %s' % (x, w))
# 引入TextRank關鍵詞抽取接口 textrank = analyse.textrank print("TextRank 算法提取的20個關鍵詞:\n") # 基于TextRank算法進行關鍵詞抽取 for x, w in textrank(anal_text, withWeight=True): print('%s %s' % (x, w))
詞性標注
import jieba.posseg as pseg pseg_text = "天安門坐落在中華人民共和國首都北京市的中心、故宮的南端,占地面積4800平方米,以杰出的建筑藝術和特殊的政治地位為世人所矚目。" print("文本:", pseg_text) words = pseg.cut(pseg_text) for word, flag in words: print("{} {}".format(word, flag))
分詞
分詞任務是中文自然語言處理的基礎性工作。漢語是以字位單位,不像西方語言,詞與詞之間沒有空格之類的標志指示詞的邊界。詞是最小的能夠獨立活動的有意義的語言成分,因此分詞的好壞直接對后續文本處理任務起到關鍵作用。
中文分詞示例:
北京 / 故宮 / 是 / 中國 / 明清 / 兩代 / 的 / 皇家 / 宮殿 / , / 舊稱 / 紫禁城,位于 / 北京 / 中軸線 / 的 / 中心 / , / 是 / 中國 / 古代 / 宮廷 / 建筑 / 之 / 精華 / 。 / 北京 / 故宮 / 占地 / 面積 / 72 / 萬 / 平方米 / , / 建筑 / 面積 / 約 / 15 / 萬 / 平方米 / 。
中文分詞方法:
基于字典、詞庫匹配的分詞方法(基于規則)
基于字符串匹配分詞,機械分詞算法。將待分的字符串與一個充分大的機器詞典中的詞條進行匹配。分為正向匹配和逆向匹配;最大長度匹配和最小長度匹配;單純分詞和分詞與標注過程相結合的一體化方法。所以常用的有:正向最大匹配,逆向最大匹配,最少切分法。
基于詞頻度統計的分詞方法(基于統計)
相鄰的字同時出現的次數越多,越有可能構成一個詞語,對語料中的字組頻度進行統計,基于詞的頻度統計的分詞方法是一種全切分方法。
基于知識理解的分詞方法
該方法主要基于句法、語法分析,并結合語義分析,通過對上下文內容所提供信息的分析對詞進行定界。由于漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式。因此目前基于知識的分詞系統還處在試驗階段。
jieba 分詞結合了基于規則和基于統計這兩類方法。
首先基于前綴詞典進行詞圖掃描,前綴詞典是指詞典中的詞按照前綴包含的順序排列,例如詞典中出現了“廣”,之后以“廣”開頭的詞都會出現在這一部分,例如“廣東”,進而會出現“廣東省”,從而形成一種層級包含結構。
如果將詞看作節點,詞和詞之間的分詞符看作邊,那么一種分詞方案則對應著從第一個字到最后一個字的一條分詞路徑。
因此,基于前綴詞典可以快速構建包含全部可能分詞結果的有向無環圖,這個圖中包含多條分詞路徑,有向是指全部的路徑都始于第一個字、止于最后一個字,無環是指節點之間不構成閉環。
基于標注語料,使用動態規劃的方法可以找出最大概率路徑,并將其作為最終的分詞結果。對于未登錄詞,jieba 使用了基于漢字成詞的 HMM(隱馬爾可夫模型)模型,采用了 Viterbi(維特比)算法進行推導。
jieba 分詞支持三種分詞模式:
全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
精確模式:試圖將句子最精確地切開,適合文本分析;
搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
關鍵詞提取
關鍵詞提取就是從文本里面把跟這篇文章意義最相關的一些詞語抽取出來,在文獻檢索、自動文摘、文本分類等方面有著重要的應用。
目前比較常用的關鍵詞提取算法都是基于無監督算法,如:TF-IDF 算法,TextRank 算法和主題模型算法(包括LSA,LSI,LDA等)。
jieba 提供了兩種關鍵詞提取方法,分別基于 TF-IDF 算法和 TextRank 算法。
TF-IDF(Term Frequency-Inverse Document Frequency, 詞頻-逆文件頻率)是一種統計方法,用以評估一個詞語對于一個文件集或一個語料庫中的一份文件的重要程度,其原理為:一個詞語在一篇文章中出現次數越多,同時在所有文檔中出現次數越少,越能夠代表該文章。
計算公式為:TF-IDF = TF·IDF
其中:
TF(term frequency):詞頻,某一個給定的詞語在該文件中出現的次數,計算公式:
IDF(inverse document frequency):逆文件頻率,如果包含詞條的文件越少,則說明詞條具有很好的類別區分能力,計算公式:
通過 jieba.analyse.extract_tags 方法可以基于 TF-IDF 算法進行關鍵詞提取,
其中topK為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20 ;withWeight為是否需要返回關鍵詞權重值。
TextRank是另一種關鍵詞提取算法,其基本思想來源于PageRank算法,通過把文本分割成若干組成單元(單詞、句子)并建立圖模型,利用投票機制對文本中的重要成分進行排序,僅利用單篇文檔本身的信息即可實現關鍵詞提取、文摘。
TextRank原理詳細內容參見論文《TextRank: Bringing Order into Texts》
通過jieba.analyse.textrank方法可以使用基于TextRank算法的關鍵詞提取
詞性標注
詞性標注(POS tagging,Part-Of-Speech tagging)也被稱為語法標注,是自然語言處理中一項非常重要的基礎性工作。
詞性標注是各類基于文本的機器學習任務,例如語義分析和指代消解的預處理步驟。
詞性是詞匯基本的語法范疇,通常也稱為詞類,主要用來描述一個詞在上下文的作用。例如,描述一個概念的詞就是名詞,在下文引用這個名詞的詞就是代詞。有的詞性經常會出現一些新的詞,例如名詞,這樣的詞性叫做開放式詞性。另外一些詞性中的詞比較固定,例如代詞,這樣的詞性叫做封閉式詞性。因為存在一個詞對應多個詞性的現象,所以給詞準確地標注詞性并不是很容易。例如,“改革”在“中國開始對計劃經濟體制進行改革”這句話中是一個動詞,但是在“醫藥衛生改革中的經濟問題”這個句子中是一個名詞。把這個問題抽象出來,就是已知單詞序列,給每個單詞標注詞性。
目前采用的詞性標注方法主要有基于統計模型的標注方法、基于規則的標注方法、統計方法與規則方法相結合的方法、基于有限狀態轉換機的標注方法和基于神經網絡的詞性標注方法。
不同的語言有不同的詞性標注集。為了方便指明詞的詞性,可以給每個詞性編碼,可以具體參考《ICTCLAS 漢語詞性標注集》,示例如下:
a —— 形容詞
b —— 區別詞
c —— 連詞
d —— 副詞
e —— 嘆詞
g —— 語素字
h —— 前接成分
i —— 成語
j —— 簡稱
k —— 后接成分
m —— 數詞
n —— 普通名詞
nd —— 方位名詞
nh —— 人名
ni —— 機構名
nl —— 處所名詞
ns —— 地名
nt —— 時間詞
nz —— 其他名詞
o —— 擬聲詞
p —— 介詞
q —— 量詞
r —— 代詞
u —— 助詞
v —— 動詞
x —— 非語素字
jieba 中提供了詞性標注功能,可以標注標注句子分詞后每個詞的詞性,詞性標注集采用北大計算所詞性標注集,屬于采用基于統計模型的標注方法。
案例網頁打開不了問題的解決方案如下
首先我們通過視頻學習之后,會有官方給的鏈接,復制之后打開如下圖一,~因為復制粘貼少了一個符號-
復制粘貼后時(例子):https://nbviewer.jupyter.org/github/huaweicloud/ModelArtsLab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb
一
然后打開:
https://nbviewer.jupyter.org/圖二
需要手動修改一下:https://nbviewer.jupyter.org/github/huaweicloud/ModelArts-Lab/blob/master/notebook/DL_face_recognition_advanced/face_similarity.ipynb(成功打開的例子)將手動修改后的鏈接復制到如下圖,回車即可打開
二
另一個案例中出現的問題“不支持您的txt文件中文編碼方式,檢測到的編碼方式是%s' % encoding,”
該問題的解決可以用一下方法
解決不支持您的txt文件中的代碼方式
,如圖所示
直接下載的文件無法解釋,解決方案一如下:
系統自帶的記事本打開也能夠轉碼的,也是另存為,然后編碼選擇UTF-8
直接下載的文件無法解釋,解決方案二如下:
1,可以使用Visual打開三國演義.txt
點擊另存-
在點擊確定
選擇如圖所示即可
重新txt上傳,然后重新運行即可
或者使用UltraEdit,Vscode工具進行另存,轉換為UTF-8即可
AI 自然語言處理基礎
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。