自然语言处理-文本分析学习记录
文章目錄
- 一、TF_IDF
- 三、 jieba使用記錄
- 3.1 分詞功能
- 3.2 jieba 基于TF-IDF、TextRank 算法的關鍵詞抽取
- 四、文本分析的流程
- one-hot,N-gram,word2vec(CBOW、Skip-gram)概念區分
- 詞嵌入
- 詞匯表征(Word Representation)
- 嵌入矩陣(Embedding Matrix)
- 如何學習詞嵌入
- Word2Vec
- 如何提高softmax計算速度?
- Hierarchical softmax
- Negative sampling
- seq2seq(sequence to sequence)
- Attention
一、TF_IDF
1.1 TF(term frequency) : 即詞頻統計
去掉停用詞 : 的、是、在
《中國蜜蜂養殖》這篇文章中,出現最多的是中國,蜜蜂養殖,但中國不是關鍵詞,我們怎么讓蜜蜂養殖成為主體的,此時就需要IDF
1.2 IDF(Inverse Document Frequency)
如果某個詞比較少見,但是它在這篇文章中多次出現,那么它很可能就反應了這篇文章的特性正是我們所需要的關鍵詞.
1.3 TF_IDF 計算公式
詞頻(TF) = 某個詞在文章中出現次數 / 文章總的詞數
逆文檔頻率(IDF) = log(語料庫的文檔總數 / 包含該詞的文檔數 + 1) 以10為底,+1是因為分母不能為0.
關鍵詞是由 TF * IDF決定
舉例
例1: 假設《中國蜜蜂養殖》這個文章總共1000個詞,“中國”“蜜蜂” "養殖"各出現20詞,則這三個詞的詞頻(TF)都為0.02
例2: 搜索谷歌發現,包含 “的” 的網頁共250億張,這就是語料庫的文檔總數,假定這就是中文網頁總數,包含"中國"的網頁共有63.3億張,包含"蜜蜂"的網頁為0.484億張,包含"養殖"的網頁為0.973億張,于是"中國"的TF就為63.3.
| 中國 | 62.3 | 0.597 | 0.0119 |
| 蜜蜂 | 0.484 | 2.227 | 0.0445 |
| 養殖 | 0.973 | 2.103 | 0.0421 |
"中國"IDF計算示例:
>>> np.log10(250/63.3) 0.5965362986546825三、 jieba使用記錄
python join方法
str.join(sequence)str – 分隔符
sequence – 要連接的元素序列
輸出 r-u-n
3.1 分詞功能
jieba.cut 方法接受三個輸入參數: 需要分詞的字符串;cut_all 參數用來控制是否采用全模式;HMM 參數用來控制是否使用 HMM 模型
>>> seg_list = jieba.cut('我來到北京大學',cut_all = False,HMM = True) >>> print("/".join(seg_list))我/來到/北京大學
jieba.lcut 直接返回 list
一個簡單示例模板(讀取txt內容并分詞)
import jieba with open("filename",'r') as words_after_jieba:seq = jieba.cut(words_after_jieba.read(),cut_all=False)print("/".join(seq))文件讀寫參考廖雪峰Python教程
https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640
分詞理論(機器學習/統計方法) : HMM、CRF條件隨機場.
[使用gensim和sklearn搭建一個文本分類器(一):流程概述]
https://blog.csdn.net/u014595019/article/details/52433754/
3.2 jieba 基于TF-IDF、TextRank 算法的關鍵詞抽取
import sys sys.path.append('../')import jieba import jieba.analyse from optparse import OptionParserfile_name = "filename"content = open(file_name, 'rb').read()tags_TF_IDF = jieba.analyse.extract_tags(content, topK=5) tags_TextRank = jieba.analyse.textrank(content, topK=5)print(",".join(tags_TF_IDF)) print(",".join(tags_TextRank))四、文本分析的流程
上圖單詞解釋:
Tokenize即分詞的意思,POS是指詞性.
處理完成后得到如下 : [‘今天’,‘天氣’,‘不錯’]
之后再進行處理,根據具體情況而定
- 情感分析
- 文本相似度
- 文本分類
情感分析
情感詞典
like 1
good 2
bad -2
最簡單的方式就是遍歷一遍然后打分,但是如果遇到生詞,這種方法就無效了,此時需要機器學習
one-hot,N-gram,word2vec(CBOW、Skip-gram)概念區分
https://blog.csdn.net/jiede1/article/details/80803171
★★★ 詞嵌入的發展過程(Word Embedding)
https://www.cnblogs.com/yifanrensheng/p/12953184.html
什么是詞向量?(NPL入門)
https://blog.csdn.net/mawenqi0729/article/details/80698350
分布表示(distributional representation)與分布式表示(distributed representation)
https://blog.csdn.net/david0611/article/details/80691043
word2Vec理解
https://blog.csdn.net/Torero_lch/article/details/82350713
詞嵌入
詞匯表征(Word Representation)
下面的內容是讓你理解詞匯表征的過程,相當于一個Preliminary:
圖中的字表示位于字典的位置,Man位于5391,Woman9853,Man的表示方法就是第5391個位置是1,但這種表示方法詞與詞之間的關系無法表達.
舉個例子,假如你已經學習到了一個語言模型,當你看到“I want a glass of orange ___”,那么下一個詞會是什么?很可能是 juice。即使你的學習算法已經學到了“I want a glass of orange juice”這樣一個很可能的句子,但如果看到“I want a glass of apple ___”,因為算法不 知道 apple 和 orange 的關系很接近,就像man 和woman,king 和 queen 一樣。所以算法很 難從已經知道的 orange juice 是一個常見的東西,而明白 apple juice 也是很常見的東西或者 說常見的句子。這是因為任何兩個 one-hot 向量的內積都是 0,如果你取兩個向量,比如 king 和 queen,然后計算它們的內積,結果就是 0。如果用 apple 和 orange 來計算它們的內積, 結果也是 0。很難區分它們之間的差別,因為這些向量內積都是一樣的,所以無法知道 apple 和 orange 要比 king 和 orange,或者 queen 和 orange 相似地多。 換一種表示方式會更好,如果我們不用 one-hot 表示,而是用特征化的表示來表示每個
詞,man,woman,king,queen,apple,orange 或者詞典里的任何一個單詞,我們學習這 些詞的特征或者數值。
下面的只是一個例子,對于理解嵌入矩陣很有幫助!
換一種表示方式會更好,如果我們不用 one-hot 表示,而是用特征化的表示來表示每個詞,man,woman,king,queen,apple,orange 或者詞典里的任何一個單詞,我們學習這些詞的特征或者數值。
舉個例子,對于這些詞,比如我們想知道這些詞與 Gender(性別)的關系。假定男性的性別為-1,女性的性別為+1,那么 man 的性別值可能就是-1,而 woman 就是-1。最終根據經驗 king 就是-0.95,queen 是+0.97,apple 和 orange 沒有性別可言。 另一個特征可以是這些詞有多 Royal(高貴),所以這些詞,man,woman 和高貴沒太關系,所以它們的特征值接近 0。而 king 和 queen 很高貴,apple 和 orange 跟高貴也沒太大 關系。那么 Age(年齡)呢?man 和woman 一般沒有年齡的意思,也許man 和woman 隱含著成年人的意思,但也可能是介于 young 和 old 之間,所以它們(man 和 woman)的值也 接近 0。而通常 king 和 queen 都是成年人,apple 和 orange 跟年齡更沒什么關系了。
所以你可以想很多的特征,為了說明,我們假設有 300 個不同的特征,這樣的話你就有了這一列數字(上圖編號 1 所示),這里我只寫了 4 個,實際上是 300 個數字,這樣就組成 了一個 300 維的向量來表示man 這個詞。接下來,我想用𝑒5391這個符號來表示,就像這樣 (上圖編號 2 所示)。同樣這個 300 維的向量,我用𝑒9853代表這個 300 維的向量用來表示 woman 這個詞(上圖編號 3 所示),這些其他的例子也一樣。 現在,如果用這種表示方法 來表示 apple 和 orange 這些詞,那么 apple 和 orange 的這種表示肯定會非常相似,可能有 些特征不太一樣,因為 orange 的顏色口味,apple 的顏色口味,或者其他的一些特征會不太 一樣,但總的來說 apple 和 orange 的大部分特征實際上都一樣,或者說都有相似的值。 這樣對于已經知道 orange juice 的算法很大幾率上也會明白 apple juice 這個東西,這樣對于不 同的單詞算法會泛化的更好。
嵌入矩陣(Embedding Matrix)
我們的目標是學習一個嵌入矩陣𝐸。你將會隨機地初始化矩陣𝐸,然后使用梯度下降法來學習這個 300×10000 的矩陣中的各個參數,𝐸 乘以這個 one-hot 向量(上圖編號1所示)會得到嵌入向量(就是每一個詞的向量表示).
小結: 將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。在這里是300維.
參考 https://www.jianshu.com/p/471d9bfbd72f
假設這個嵌入矩陣叫做矩陣 EEE (就是上面加了300個特征之后的),注意如果用 EEE 去乘以右邊的 one-hot 向量(上圖編號 3 所示),也就是 O6527O_{6527}O6527? ,那么就會得到一個 300 維的向量,EEE 是 300×10000 的,O6527O_{6527}O6527? 是 10000×1 的,所以它們的積是 300×1 的,即 300 維的向量。(也就是說就可以得到orange這一列)
如何學習詞嵌入
下面我將介紹如何建立神經網絡來預測下面序列中的下一個單詞:
“I want a glass of orange ____.”
讓我為這些詞列一個表格,就是要得到嵌入矩陣,然后得到每個詞各自的向量表示,
于是現在你有許多 300 維的嵌入向量。我們能做的就是把它們全部放進神經網絡中(上圖編號 3 所示),經過神經網絡以后再通過 softmax層(上圖編號 4 所示),這個 softmax 也有自己的參數,然后這個 softmax 分類器會在10,000個可能的輸出中預測結尾這個單詞。 假如說在訓練集中有 juice 這個詞,訓練過程中 softmax 的目標就是預測出單詞 juice,就是 結尾的這個單詞。這個隱藏層(上圖編號 3 所示)有自己的參數,我這里用𝑊[1]和𝑏[1]來表 示,這個 softmax 層(上圖編號 4 所示)也有自己的參數𝑊[2]和𝑏[2]。如果它們用的是 300 維大小的嵌入向量,而這里有 6 個詞,所以用 6×300,所以這個輸入會是一個 1800 維的向 量,這是通過將這 6 個嵌入向量堆在一起得到的.
實際上更常見的是有一個固定的歷史窗口,舉個例子,你總是想預測給定四個單詞(上圖編號 1 所示)后的下一個單詞,注意這里的 4 是算法的超參數。這就是如何適應很長或者很短的句子,方法就是總是只看前 4 個單詞,所以說我只用這 4 個單詞(上圖編號 2 所示) 而不去看這幾個詞(上圖編號 3 所示)。如果你一直使用一個 4 個詞的歷史窗口,這就意味 著你的神經網絡會輸入一個 1200 維的特征變量到這個層中(上圖編號 4 所示),然后再通 過 softmax 來預測輸出,選擇有很多種,用一個固定的歷史窗口就意味著你可以處理任意長度的句子,因為輸入的維度總是固定的。所以這個模型的參數就是矩陣𝐸,對所有的單詞用的都是同一個矩陣𝐸,而不是對應不同的位置上的不同單詞用不同的矩陣。然后這些權重(上圖編號 5 所示)也都是算法的參數,你可以用反向傳播來進行梯度下降來最大化訓練集似 然,通過序列中給定的 4 個單詞去重復地預測出語料庫中下一個單詞什么。
事實上通過這個算法能很好地學習詞嵌入,原因是,如果你還記得我們的 orange jucie,apple juice的例子,在這個算法的激勵下,apple 和 orange 會學到很相似的嵌入,這樣做能夠讓算法更好地擬合訓練集,因為它有時看到的是 orange juice,有時看到的是 apple juice。 如果你只用一個 300 維的特征向量來表示所有這些詞,算法會發現要想最好地擬合訓練集, 就要使 apple(蘋果)、orange(橘子)、grape(葡萄)和 pear(梨)等等,還有像 durian (榴蓮)這種很稀有的水果都擁有相似的特征向量。
Word2Vec
word2vec是如何得到詞向量的? - crystalajj的回答 - 知乎
https://www.zhihu.com/question/44832436/answer/266068967
word2vec通過訓練一個神經網絡,得到網絡的權重矩陣,作為輸入的詞向量。常用的word2vec模型是:CBOW,Skip-gram。框架圖如下:
接下來看一個Skip-gram的實例:
▲任務描述
假設在訓練集中給定了一個這樣的句子:“I want a glass of orange juice to go along with my cereal.”,在 Skip-Gram模型中,我們要做的是抽取上下文和目標詞配對,來構造一個監督學習問題: 它給定上下文詞,要求你預測在這個詞正負 10 個詞距或者正負 5 個詞距內隨機選擇的某個目標詞。
▲任務目標
但是構造這個監督學習 問題的目標并不是想要解決這個監督學習問題本身,而是想要使用這個學習問題來學到一個好的詞嵌入模型。
拿嵌入矩陣𝐸乘以向量𝑂𝑐,然后得到了輸入的上下文詞的嵌入向量,于是這里
ec=EOce_{c}=EO_{c}ec?=EOc? . 在這個神經網絡中(上圖編號 2 所示),我們將把向量 ece_{c}ec? 喂入一個 softmax 單元。我通常把 softmax 單元畫成神經網絡中的一個節點(上圖編號 3 所示),這不是字母O,而是 softmax 單元,softmax 單元要做的就是輸出𝑦^。這是 softmax 模型(上 圖編號 4 所示),預測不同目標詞的概率:
這里𝜃𝑡是一個與輸出𝑡有關的參數,即某個詞𝑡和標簽相符的概率是多少。我省略了
softmax 中的偏差項,想要加上的話也可以加上。 最終 softmax 的損失函數就會像之前一樣,我們用𝑦表示目標詞,我們這里用的𝑦和𝑦^都是用 one-hot 表示的,于是損失函數就會是:
這是常用的 softmax 損失函數,𝑦 就是只有一個 1 其他都是 0 的 one-hot 向量,如果目標詞是 juice,那么第 4834 個元素就是 1,其余是 0(上圖編號 5 所示)。類似的𝑦^是一個從 softmax 單元輸出的 10,000 維的向量,這個向量是所有可能目標詞的概率。
如何提高softmax計算速度?
實際上使用這個算法會遇到一些問題,首要的問題就是計算速度。尤其是在 softmax 模型中,每次你想要計算這個概率,你需要對你詞匯表中的所有 10000 個詞做求和計算,可能 10000 個詞的情況還不算太差。如果你用了一個大小為 100000 或 1000000 的詞匯表, 那么這個分母的求和操作是相當慢的,實際上 10000 已經是相當慢的了,所以擴大詞匯表就更加困難了。
Hierarchical softmax
Negative sampling
下面是RNN的內容
seq2seq(sequence to sequence)
通過下面兩個示例, 對seq2seq建立一個直觀的了解(僅此而已).
示例1 sequence to sequence
比如你想通過輸入一個法語句子,比如這句
“Jane visite I’Afrique enseptembre.”,
將它翻譯成一個英語句子,
“Jane is visiting Africa in September.”。
和之前一樣, 我們用 x<1>x^{<1>}x<1> 一直到 x<5>x^{<5>}x<5>來表示輸入的句子的單詞,然后我們用 y<1>y^{<1>}y<1> 到 y<6>y^{<6>}y<6>來表示輸出的句子的單詞,那么,如何訓練出一個新的網絡來輸入序列𝑥和輸出序列𝑦呢?
首先,我們先建立一個網絡,這個網絡叫做編碼網絡(encoder network)(上圖編號 1所示),它是一個 RNN 的結構, RNN 的單元可以是 GRU 也可以是 LSTM。每次只向該網絡中輸入一個法語單詞,將輸入序列接收完畢后,這個 RNN 網絡會輸出一個向量來代表這個輸入序列。之后你可以建立一個解碼網絡,我把它畫出來(上圖編號 2 所示),它以編碼網絡的輸出作為輸入,編碼網絡是左邊的黑色部分(上圖編號 1 所示),之后它可以被訓練為每次輸出一個翻譯后的單詞,一直到它輸出序列的結尾或者句子結尾標記,這個解碼網絡的工作就結束了。和往常一樣我們把每次生成的標記都傳遞到下一個單元中來進行預測,就像之前用語言模型合成文本時一樣。
示例2 image to sequence
給出一張圖片,比如這張貓的圖片(下圖編號 1 所示),它能自動地輸出該圖片的描述,一只貓坐在椅子上,那么你如何訓練出這樣的網絡?通過輸入圖像來輸出描述,像這個句子一樣。
Attention
總結
以上是生活随笔為你收集整理的自然语言处理-文本分析学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 Django 中使用 pyechar
- 下一篇: Elasticsearch学习记录