常用自然语言处理NLP模型原理
一、文本處理流程
文本清洗:html標簽與轉義字符、多余空格、根據需要清除郵箱、賬號、網址、手機號、作者信息等信息
預處理:去除停用詞、加載自定義詞庫(實體詞庫、垂直領域詞庫)、分詞
特征提取:關鍵詞、實體詞
建模:文本分類、文本聚類、情感分析、標簽提取
優化:停用詞庫與自定義詞庫清洗與豐富、文本標簽清洗、模型調整
效果評估:滿足線上使用要求,準確率、速度
上線部署:部署api接口
二、NLP算法
- 深度學習在自然語言處理當中,除了在分類問題上能夠取得較好效果外(如單選問題:情感分類、文本分類、正確答案分類問題等),在信息抽取上,尤其是在元組抽取上基本上是一塌糊涂,在工業場景下很難達到實用水準。
- 目前各種評測集大多是人為標注的,人為標注的大多為干凈環境下的較為規范的文本,而且省略了真實生產環節中的多個環節。在評測環節中達到的諸多state-of-art方法,在真實應用場景下泛化能力很差,大多僅僅是為了刷榜而刷榜。
- 目前關于知識圖譜的構建環節中,數據大多數都還是來自于結構化數據,半結構化信息抽取次之,非結構化數據抽取最少。半結構化信息抽取,即表格信息抽取最為危險,一個單元格錯誤很有可能導致所有數據都出現錯誤。非結構化抽取中,實體識別和實體關系識別難度相當大。
- 工業場景下命名實體識別,標配的BILSTM+CRF實際上只是輔助手段,工業界還是以領域實體字典匹配為主,大廠中往往在后者有很大的用戶日志,這種日志包括大量的實體信息。因此,生產環節中的實體識別工作中,基礎性詞性的構建和擴展工作顯得尤為重要。
- 目前關于知識圖譜推理問題,嚴格意義上不屬于推理的范疇,最多只能相當于是知識補全問題,如評測中的知識推理任務,是三元組補全問題。
- 目前輿情分析還是處于初級階段。目前輿情分析還停留在以表層計量為主,配以淺層句子級情感分析和主題挖掘技術的分析。對于深層次事件演化以及對象級情感分析依舊還處于初級階段。
- Bert本質上僅僅是個編碼器,是word2vec的升級版而已,不是無所不能,僅僅是編碼能力強,向量表示上語義更為豐富,然而大多人都裝糊涂。
- 學界和業界最大的區別在于,學界以探索前沿為目的,提新概念,然后搭個草圖就結束,目光并不長遠,打完這一戰就不知道下一戰打什么,下一戰該去哪里打,什么時候打,或者打一槍換個陣地再打。而業界,往往面臨著生存問題,需要考慮實際問題,還是以解決實際問題為主,因此沒必要把學界的那一套理念融入到生產環節中,要根據實際情況制定自己的方法。
- 利用結構化數據,尤其是百科類infobox數據,采集下來,存入到Neo4j圖數據庫中,就稱自己建立了知識圖譜的做法是偽知識圖譜做法。基于這類知識圖譜,再搞個簡單的問答系統,就標榜自己是基于知識圖譜的智能問答,實際上很膚淺。
- 知識圖譜不是結構化知識的可視化(不是兩個點幾條邊)那么簡單,那叫知識的可視化,不是知識圖譜。知識圖譜的核心在于知識的圖譜化,特點在于知識的表示方法和圖譜存儲結構,前者決定了知識的抽象表示維度,后者決定了知識運行的可行性,圖算法(圖遍歷、聯通圖、最短路徑)。基于圖譜存儲結構,進行知識的游走,進行知識表征和未知知識的預測。
- 物以稀為貴,大家都能獲取到的知識,往往價值都很低。知識圖譜也是這樣,只有做專門性的具有數據壁壘的知識圖譜,才能帶來商業價值。
- 目前智能問答,大多都是人工智障,通用型的閑聊型問答大多是個智障,多輪對話缺失,答非所問等問題層出不窮。垂直性的問答才是出路,但真正用心做的太少,大多都是處于demo級別。
- 大多數微信自然語言處理軟文實際上都不可不看,純屬浪費時間。尤其是在對內容的分析上,大多是抓語料,調包統計詞頻,提取關鍵詞,調包情感分析,做柱狀圖,做折線圖,做主題詞云,分析方法上千篇一律。應該從根本上去做方法上的創新,這樣才能有營養,從根本上來說才能有營養可言。文本分析應該從淺層分析走向深層分析,更好地挖掘文本的語義信息。
- 目前百科類知識圖譜的構建工作有很多,重復性的工作不少。基于開放類百科知識圖譜的數據獲取接口有復旦等開放出來,可以應用到基本的概念下實體查詢,實體屬性查詢等,但目前僅僅只能做到一度。
- 基于知識圖譜的問答目前的難點在于兩個方面,1)多度也稱為多跳問題,如姚明的老婆是誰,可以走14條回答,但姚明的老婆的女兒是誰則回答不出來,這種本質上是實體與屬性以及實體與實體關系的分類問題。2)多輪問答問題。多輪分成兩種,一種是指代補全問答, 如前一句問北京的天氣,后者省略“的天氣”這一詞,而只說“北京”,這個需要進行意圖判定并準確加載相應的問答槽。另一種是追問式多輪問答,典型的在天氣查詢或者酒店預訂等垂直性問答任務上。大家要抓住這兩個方面去做。
- 關系挖掘是信息抽取的重要里程碑,理解了實體與實體、實體與屬性、屬性與屬性、實體與事件、事件與事件的關系是解決真正語義理解的基礎,但目前,這方面,在工業界實際運用中,特定領域中模板的性能要比深度學習多得多,學界大多采用端到端模型進行實驗,在這方面還難以超越模版性能。
1、TF-IDF
1)原理:詞頻-逆文檔頻率;一種用于信息檢索與文本挖掘的常用加權技術;一種統計方法,用以評估一個字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度,字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。
2)主要思想:如果某個單詞在一篇文章中出現的頻率TF高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
3)公式:
? ? ? ? ? TF=在某一文本中詞條w出現的次數/該文本中所有的詞條數目
? ? ? ? ? IDF=log(語料庫的文檔總數/(包含詞條w的文檔數+1)),避免分母為0
? ? ? ? ? TF-IDF=TF*IDF
4)優缺點:實現簡單,容易理解,但未考慮詞語語義信息,無法處理一詞多義與一義多詞
5)應用:搜索引擎,關鍵詞提取,文本相似性計算,文本摘要
6)python調參:
提取關鍵詞
keywords = jieba.analyse.extract_tags(sentence, topK=10, withWeight=False, allowPOS=())? ? # 主要調參指定詞性的詞
提取特征向量
tfidf = TfidfVectorizer(ngram_range=(1, 2), min_df=1, max_df=0.9, token_pattern=r"(?u)\b\w+\b", stop_words=stopwords, max_features=1000)
 '''
 ?? ?ngram_range=(1, 2) : 詞組長度為1和2
 ?? ?min_df : 忽略出現頻率小于1的詞
 ?? ?max_df : 忽略在百分之九十以上的文本中出現過的詞
 ?? ?token_pattern=r"(?u)\b\w+\b" : 包含單字
 ?? ?stop_words : 停用詞表
 ?? ?max_features=1000: 最大特征向量維度
 '''
2、Textrank
1)原理:將每個句子看成一個節點,若兩個句子之間有相似性,認為對應的兩個節點之間有一個無向有權邊,權值是相似度。通過pagerank算法(兩個假設:數量假設,頁面A被其他網頁鏈接越多,頁面A越重要;質量假設,質量越高的頁面鏈接指向頁面A,頁面A越重要)計算得到的重要性最高的若干句子可以當作摘要。PageRank主要用于對在線搜索結果中的網頁進行排序。
PageRank的核心公式是PageRank值的計算公式。公式如下:
其中,PR(Vi)表示結點Vi的rank值,In(Vi)表示結點Vi的前驅結點集合,Out(Vj)表示結點Vj的后繼結點集合。
 這個公式來自于《統計學習方法》,等號右邊的平滑項(通過某種處理,避免一些突變的畸形值,盡可能接近實際情況)不是(1-d),而是(1-d)/n。
是被研究的頁面,是鏈入頁面的數量,是鏈出頁面的數量,而N是所有頁面的數量。
在文本自動摘要的案例中,TextRank和PageRank的相似之處在于:
-  用句子代替網頁 
-  任意兩個句子的相似性等價于網頁轉換概率 
-  相似性得分存儲在一個方形矩陣中,類似于PageRank的矩陣M 
不過公式有些小的差別,那就是用句子的相似度類比于網頁轉移概率,用歸一化的句子相似度代替了PageRank中相等的轉移概率,這意味著在TextRank中,所有節點的轉移概率不會完全相等。
TextRank算法是一種抽取式的無監督的文本摘要方法。讓我們看一下我們將遵循的TextRank算法的流程:
3、知識庫構建
- 停用詞庫
- 語料庫
- 自定義分詞詞庫
- 人物庫
- 垂直領域詞庫
4、知識圖譜
- 三元組
- NEO4教程:Neo4j是一個世界領先的開源圖形數據庫。 它是由Neo技術使用Java語言完全開發的。
-  CQL代表Cypher查詢語言。 像Oracle數據庫具有查詢語言SQL,Neo4j具有CQL作為查詢語言。 
Neo4j CQL:
-  它是Neo4j圖形數據庫的查詢語言。 
-  它是一種聲明性模式匹配語言 
-  它遵循SQL語法。 
-  它的語法是非常簡單且人性化、可讀的格式。 
5、預訓練模型
語言模型
預訓練模型(Pre-trained Models,PTMs)
深度學習時代,為了充分訓練深層模型參數并防止過擬合,通常需要更多標注數據喂養。在NLP領域,標注數據更是一個昂貴資源。PTMs從大量無標注數據中進行預訓練使許多NLP任務獲得顯著的性能提升。總的來看,預訓練模型PTMs的優勢包括:
詞嵌入是自然語言處理(NLP)中語言模型與表征學習技術的統稱。概念上而言,它是指把一個維數為所有詞的數量的高維空間嵌入到一個維數低得多的連續向量空間中,每個單詞或詞組被映射為實數域上的向量,這也是分布式表示:向量的每一維度都沒有實際意義,而整體代表一個具體概念。
分布式表示相較于傳統的獨熱編碼(one-hot)表示具備更強的表示能力,而獨熱編碼存在維度災難和語義鴻溝(不能進行相似度計算)等問題。傳統的分布式表示方法,如矩陣分解(SVD/LSA)、LDA等均是根據全局語料進行訓練,是機器學習時代的產物。PTMs也屬于分布式表示的范疇。
PTMs兩大范式:「淺層詞嵌入」和「預訓練編碼器」。
淺層詞嵌入(?Non-Contextual Embeddings):即詞向量,其主要特點是學習到的是上下文獨立的靜態詞嵌入,其主要代表如下。這一類詞嵌入通常采取淺層網絡進行訓練,而應用于下游任務時,整個模型的其余部分仍需要從頭開始學習。因此,對于這一范式的PTMs沒有必要采取深層神經網絡進行訓練,采取淺層網絡加速訓練也可以產生好的詞嵌入。
- NNLM
- word2vec(CBOW、Skip-Gram)
- Glove
淺層詞嵌入的主要缺陷為:
- 詞嵌入與上下文無關,每個單詞的嵌入向量始終是相同,因此不能解決一詞多義的問題。
- 通常會出現OOV問題(out of vocabulary,未登錄詞),為了解決這個問題,相關文獻提出了字符級表示或sub-word表示,如CharCNN?、FastText和 Byte-Pair Encoding?。
預訓練編碼器(Contextual Embeddings):主要目的是通過一個預訓練的編碼器能夠輸出上下文相關的詞向量,解決一詞多義的問題。這一類預訓練編碼器輸出的向量稱之為「上下文相關的詞嵌入」。這一類「預訓練編碼器」范式的PTMs主要代表有ELMO、GPT-1、BERT、XLNet等。
- CNN(序列模型):TEXTCNN,設定窗口,然后對窗口內的若干詞進行卷積操作,得到這個窗口內的詞的嵌入表示
- RNN(序列模型):基于LSTM/GRU的,基于單向(從左向右)或者雙向的RNN模型,對整個序列進行建模,得到每個詞的語境下的嵌入表示
- 全連接自注意力模型(self-attention,非序列化模型):使用全連接圖,來建立任意兩個詞之間的關系,并通過大規模無標注數據,讓模型自動學習結構化信息。通常,兩個詞之間的”連接權重“會被自注意力機制動態計算。典型的代表就是Transformer中的multi-head self-attention網絡結構了
- ELMO
- BERT
- GPT
上圖中,(a)里面的卷積網絡,可以認為窗口為3,例如 h2?由 x1、x2、x3?決定。(b)里面的 h2?由 h1?,h3??和 x2?決定,具體可以使用LSTM, GRU等網絡結構。(c)有點復雜,可以結合Transformer網絡結構來理解。
分析:
序列模型:局部性偏見,難于捕捉長距離交互;但是容易訓練,并在若干NLP任務上取得了不錯的結果;
非序列模型:(代表是Transformer)更強大,使用的參數更多,可以更好的覆蓋長距離依賴的問題;但是,需要大規模訓練語料(可以是unlabel的!),容易在中小規模數據上過擬合。
當然,Transformer已經是目前幾年的研究熱點,不單單在NLP領域,在CV領域和speech領域也越來越引起重視,儼然成為了“中流砥柱”!
上圖給出了NLP各種編碼器間的對比。PTMs中預訓練編碼器通常采用LSTM和Transformer(Transformer-XL),其中Transformer又依據其attention-mask方式分為Transformer-Encoder和Transformer-Decoder兩部分。此外,Transformer也可看作是一種圖神經網絡GNN。
三、參考文獻
實話實說:中文自然語言處理的N個真實情況
NLP中預訓練模型的綜述I
PTMs:NLP預訓練模型的全面總結
2020年3月18日,邱錫鵬老師發表了關于NLP預訓練模型的綜述《Pre-trained Models for Natural Language Processing: A Survey》,這是一篇全面的綜述,系統地對PTMs進行了歸納分類
總結
以上是生活随笔為你收集整理的常用自然语言处理NLP模型原理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 微信小程序新手容易犯的错误_新手程序员的
- 下一篇: 向量空间
