文本數據簡單向量化


原網址:http://blog.csdn.net/juanqinyang/article/details/58222264

【機器學習】文本數據簡單向量化

原創 2017年02月27日 22:13:40
 

一個文本數據指的是一篇文章,或者一段話,或者一句話。這個文本數據通常稱為document,或者text。我們平常的文本都是以人的表達方式展現的,是一個流數據,時間序列數據。我們如果要用計算機對文本數據進行處理,就必須將文本數據表示為計算機能理解的方式。這篇博客就講解給定一個已經分詞、去除停用詞后的文本數據集,如何將其向量化的方法。

one-hot表示法

one-hot表示法先將文本數據集中不重復的單詞提取出來,得到一個大小為V的詞匯表。然后用一個V維的向量來表示一個文章,向量中的第d個維度上的1表示詞匯表中的第d個單詞出現在這篇文章中。比如給定一個數據集
這里寫圖片描述

首先提取出其中的不重復單詞(不考慮單詞在文本中出現的先后順序),得到一個含有7個單詞的詞匯表:
這里寫圖片描述

那么文本數據集就轉化為one-hot矩陣:
這里寫圖片描述

vocab = sorted(set(words), key=words.index)

def doc2onehot_matrix(vocab, docs): ''' transform a document to onehot vector ''' M = len(docs) V = len(vocab) onehot = np.zeros((M, V)) for d, doc in enumerate(docs): for word in doc: if word in vocab: pos = vocab.index(word) onehot[d][pos] = 1 return onehot

如果文本數據集太大,那么得到的詞匯表中可能存在幾千個單詞,這樣會文本的維度太大,不僅會導致計算時間增加,而且帶來了稀疏問題(one-hot矩陣中大多數元素都是0)。因此,我們通常在計算詞匯表的時候,會排除那些出現次數太少的單詞,從而降低文本維度。

tf 表示法

不同於one-hot表示法只關心單詞是否出現,tf (term-frequency)表示法還關心單詞出現的次數,因此tf矩陣中每個元素表示其對應的單詞在文章中出現的次數/文章中的總次數,即單詞在文章中的頻率。

tfi,j=ni,jknik,j

對於上述的文本數據集,如果用tf矩陣表示就是:
這里寫圖片描述

tf-idf 表示法

tf-idf (term frequency–inverse document frequency),不僅考慮了單詞在文章中的出現次數,還考慮了其在整個文本數據集中的出現次數。TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力。idf就是用來衡量一個單詞在所有文本中的出現頻率,其計算公式為:

idfi=log|D||{j:tidj}|

期中, |D|表示總文章數,分母表示包含詞i的文章數。通常,為了防止分母為0會在分母加1,即
idfi=log|D|1+|{j:tidj}|

在idf的計算公式中使用了log,是因為如果某個詞在這個文本中的出現次數太少,就會使得|D|除以這個次數得到的值非常大,直接乘以tf會使得idf對計算結果的影響非常大,因此取對數來抑制idf的影響。那么對數應該以什么為底呢?其實任何正數都是可以的,底的取值跟文本數據集沒有關系的,因為底的取之不同,並不會改變每個單詞的相對重要性。不過一般的取值是10。

def doc2onehot_tf_matrix(vocab, docs): ''' transform document to onehot vector ''' M = len(docs) V = len(vocab) onehot = np.zeros((M, V)) tf = np.zeros((M, V)) for d, doc in enumerate(docs): for word in doc: if word in vocab: pos = vocab.index(word) onehot[d][pos] = 1 tf[d][pos] += 1 # normalize to get term frequency row_sum = tf.sum(axis=1) tf = tf / row_sum[:, np.newaxis] return onehot, tf def doc2tfidf_matrix(onehot, tf): ''' transform document to tf-idf ''' M = onehot.shape[0] ndw = onehot.sum(axis=0) # number of documents contain word idf = list(map(lambda x: log10(M) / (x+1), ndw)) tfidf = tf * np.array(idf) return tfidf

 


其他方法

上述方法都以一定的合理性將文本轉化為了向量,但是卻存在“語義鴻溝”問題。比如one-hot表示法,假設一個文本中只存在一個詞麥克,另外一個文本中只存在一個詞話筒,那么可以將這兩個文章分別表示為[0,0,0,0,1,0,0,0],[1,0,0,0,0,0,0,0],這樣雖然兩個文本中的單詞相似,但是得到的距離卻很遠。因此一些深度學習方法將文本將單詞表示為n維的實值向量,類似[0.792, −0.177, −0.107, 0.109, −0.542, …]形式。那么每個文本可以基於這些詞向量,通過某種方式提取為m維的實值向量。通過這種方法表示的文本,再通過歐氏距離或者余弦距離方法計算得到的距離,就能使得語義相似的詞得到的距離相近。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM