文本表示的意思是把字詞處理成向量或矩陣康二,以便計算機能進(jìn)行處理碳胳。文本表示是自然語言處理的開始環(huán)節(jié)。
文本表示按照細(xì)粒度劃分沫勿,一般可分為
字級別(char level):
如把“鄧紫棋實在太可愛了挨约,我想養(yǎng)一只”這句話拆成一個個的字:{鄧,紫产雹,棋诫惭,實,在蔓挖,太夕土,可,愛瘟判,了怨绣,我,想拷获,養(yǎng)篮撑,一,只}匆瓜,然后把每個字用一個向量表示赢笨,那么這句話就轉(zhuǎn)化為了由14個向量組成的矩陣。
文本表示:
分為離散表示和分布式表示驮吱。
離散表示的代表就是詞袋模型茧妒,one-hot(也叫獨熱編碼)、TF-IDF左冬、n-gram都可以看作是詞袋模型
分布式表示也叫做詞嵌入(word embedding)桐筏,經(jīng)典模型是word2vec,還包括后來的Glove拇砰、ELMO九昧、GPT和最近很火的BERT。
詞袋模型:離散毕匀、高維、稀疏癌别;
假如現(xiàn)在有1000篇新聞文檔皂岔,把這些文檔拆成一個個的字,去重后得到3000個字展姐,然后把這3000個字作為字典躁垛,進(jìn)行文本表示的模型剖毯,叫做詞袋模型。這種模型的特點是字典中的字沒有特定的順序教馆,句子的總體結(jié)構(gòu)也被舍棄了逊谋。下面分別介紹詞袋模型中的one-hot、TF-IDF和n-gram文本表示方法土铺。
其原理就是把句子看著若干個單詞的集合胶滋,不會考慮單詞的出現(xiàn)順序,僅僅考慮單詞出現(xiàn)沒有或者出現(xiàn)的頻率悲敷,這樣看來每一個句子都可能有高維究恤、稀疏和離散的情況,即使通過n-gram來表征單詞間的關(guān)聯(lián)也會造成高維后德、稀疏的情況發(fā)生部宿,所以缺點是明顯:
比如:語義丟失, 表現(xiàn)為詞的順序信息丟失瓢湃;近義詞沒辦法體現(xiàn)理张;假定詞都是獨立的,等绵患。
one-hot
有該詞就是1否則為0
第一個問題是數(shù)據(jù)稀疏和維度災(zāi)難雾叭。
數(shù)據(jù)稀疏也就是向量的大部分元素為0,如果詞袋中的字詞達(dá)數(shù)百萬個藏雏,那么由每篇文檔轉(zhuǎn)換成的向量的維度是數(shù)百萬維拷况,由于每篇文檔去重后字?jǐn)?shù)較少,因此向量中大部分的元素是0掘殴。而且對數(shù)百萬維的向量進(jìn)行計算是一件比較蛋疼的事赚瘦。但是這樣進(jìn)行文本表示有幾個問題∽嗾可見起意,盡管兩個句子的長度不一樣,但是one-hot編碼后長度都一樣了病瞳,方便進(jìn)行矩陣運算揽咕。第二個問題是沒有考慮句中字的順序性
假定字之間相互獨立。這意味著意思不同的句子可能得到一樣的向量套菜。比如“我太可愛了亲善,鄧紫棋愛我”,“鄧紫棋要看我的演唱會”逗柴,得到的one-hot編碼和上面兩句話的是一樣的蛹头。第三個問題是沒有考慮字的相對重要性。
這種表示只管字出現(xiàn)沒有,而不管出現(xiàn)的頻率渣蜗,但顯然一個字出現(xiàn)的次數(shù)越多屠尊,一般而言越重要(除了一些沒有實際意義的停用詞)。
TF-IDF
TF-IDF用來評估字詞對于文檔集合中某一篇文檔的重要程度耕拷。字詞的重要性與它在某篇文檔中出現(xiàn)的次數(shù)成正比讼昆,與它在所有文檔中出現(xiàn)的次數(shù)成反比。TF-IDF的計算公式為:
TF-IDF的思想比較簡單骚烧,但是卻非常實用浸赫。然而這種方法還是存在著數(shù)據(jù)稀疏的問題,也沒有考慮字的前后信息止潘。
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
# stop words自定義停用詞表掺炭,為列表List類型
# token_pattern過濾規(guī)則,正則表達(dá)式凭戴,如r"(?u)bw+b
# max_df=0.5涧狮,代表一個單詞在 50% 的文檔中都出現(xiàn)過了,那么它只攜帶了非常少的信息么夫,因此就不作為分詞統(tǒng)計
documents = [
'this is the bayes document',
'this is the second second document',
'and the third one',
'is this the document'
]
tfidf_matrix = tfidf_vec.fit_transform(documents)
# 擬合模型者冤,并返回文本矩陣 表示了每個單詞在每個文檔中的 TF-IDF 值
print('輸出每個單詞在每個文檔中的 TF-IDF 值,向量里的順序是按照詞語的 id 順序來的:', '\n', tfidf_matrix.toarray())
print('不重復(fù)的詞:', tfidf_vec.get_feature_names())
print('輸出每個單詞對應(yīng)的 id 值:', tfidf_vec.vocabulary_)
print('返回idf值:', tfidf_vec.idf_)
print('返回停用詞表:', tfidf_vec.stop_words_)
n-gram
上面詞袋模型的兩種表示方法假設(shè)字與字之間是相互獨立的档痪,沒有考慮它們之間的順序涉枫。于是引入n-gram(n元語法)的概念。n-gram是從一個句子中提取n個連續(xù)的字的集合腐螟,可以獲取到字的前后信息愿汰。一般2-gram或者3-gram比較常見。
比如“鄧紫棋太可愛了乐纸,我愛鄧紫棋”衬廷,“我要看鄧紫棋的演唱會”這兩個句子,分解為2-gram詞匯表:
{鄧汽绢,鄧紫吗跋,紫,紫棋宁昭,棋跌宛,棋太,太积仗,太可疆拘,可,可愛寂曹,愛入问,愛了丹锹,了,了我芬失,我,我愛匾灶,愛鄧棱烂,我要,要阶女,要看颊糜,看鄧,棋的秃踩,的衬鱼,的演,演憔杨,演唱鸟赫,唱會,會}
于是原來只有14個字的1-gram字典(就是一個字一個字進(jìn)行劃分的方法)就成了28個元素的2-gram詞匯表消别,詞表的維度增加了一倍抛蚤。
結(jié)合one-hot,對兩個句子進(jìn)行編碼得到:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0]
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1]
也可以結(jié)合TF-IDF來得到文本表示寻狂,這里不再計算岁经。
這種表示方法的好處是可以獲取更豐富的特征,提取字的前后信息蛇券,考慮了字之間的順序性缀壤。
但是問題也是顯而易見的,這種方法沒有解決數(shù)據(jù)稀疏和詞表維度過高的問題纠亚,而且隨著n的增大塘慕,詞表維度會變得更高。
這種表示方法的好處是可以獲取更豐富的特征菜枷,提取字的前后信息苍糠,考慮了字之間的順序性。
分布式表示:連續(xù)啤誊、低維岳瞭、稠密。
基本思想是把研究的對象表示成一個低維的稠密的實質(zhì)的向量蚊锹,那么這種向量的物理意義就是在于它能夠把所有的這些對象都能夠表示在一個語義的空間里瞳筏。
Word2vec
是Google的Mikolov等人提出來的一種文本分布式表示的方法,這種方法是對神經(jīng)網(wǎng)絡(luò)語言模型的“瘦身”牡昆, 巧妙地運用層次softmax(hierarchical softmax )和負(fù)采樣(Negative sampling )兩種技巧姚炕,使得原本參數(shù)繁多摊欠、計算量巨大的神經(jīng)網(wǎng)絡(luò)語言模型變得容易計算。
Word2vec概括地說是包含了兩種模型和兩種加速訓(xùn)練方法:
兩種模型:CBOW(continuous bag-of-words)和Skip-Gram柱宦。
CBOW的目標(biāo)是通過上下文的詞語預(yù)測中間的詞是什么些椒。而skip-gram則相反,由一個特定的詞來預(yù)測前后可能出現(xiàn)的詞掸刊。這兩個模型并非是在Word2vec中首次提出免糕,而是神經(jīng)網(wǎng)絡(luò)語言模型中就有的。
兩種方法:層次softmax和負(fù)采樣忧侧。
層次softmax是通過構(gòu)建一種有效的樹結(jié)構(gòu)(哈夫曼樹石窑,huffman tree)來加速計算詞語的概率分布的方法;而負(fù)采樣則是通過隨機抽取負(fù)樣本蚓炬,與正樣本一起參加每次迭代松逊,變成一個二分類問題而減少計算量的方法。
word2vec原理推導(dǎo)與代碼分析 word2vec2
參考:https://github.com/2692999758/nlp-plus-/blob/master/word2vec.md
https://blog.csdn.net/huacha__/article/details/84068653
https://blog.csdn.net/sinat_29694963/article/details/79177832
- keras.layers.Embedding
https://keras-zh.readthedocs.io/layers/embeddings/
上圖的流程是把文章的單詞使用詞向量來表示肯夏。
(1)提取文章所有的單詞经宏,把其按出現(xiàn)的次數(shù)降序排列
(2)每個編號ID都可以使用50000維的二進(jìn)制(one-hot)表示
(3)最后,我們會生產(chǎn)一個矩陣M熄捍,行大小為詞的個數(shù)50000烛恤,列大小為詞向量的維度(通常取128或300)。
那這個矩陣M怎么獲得呢余耽?在Skip-Gram 模型中缚柏,我們會隨機初始化它,然后使用神經(jīng)網(wǎng)絡(luò)來訓(xùn)練這個權(quán)重矩陣
那我們的輸入數(shù)據(jù)和標(biāo)簽是什么碟贾?如下圖币喧,輸入數(shù)據(jù)就是中間的哪個藍(lán)色的詞對應(yīng)的one-hot編碼,標(biāo)簽就是它附近詞的one-hot編碼(這里windown_size=2,左右各取2個)
我輸入數(shù)組中的詞典大小是3袱耽,即有三個不同的詞杀餐,所以我的input_dim便要比3要大1,其中output_dim便是輸出維度朱巨,就如同CNN最后的全連接層一樣史翘,上面我設(shè)置的5,便將每一位要表示的數(shù)字變?yōu)橛?x5來表示的向量冀续。