文本学习
詞袋
在文本學習中輸入的每個句子的長度和內容都有可能是不同的,你不能根據句子的長度進行劃分。那么如何將文本中的內容用于機器學習呢?
我們現在介紹詞袋的概念。
他的基本理念就是選定一個文本,然后計算文本的頻率。
如圖所示,實際上詞袋以向量形式統計每個單詞出現的次數。
很明顯的是詞袋只是對于單詞數量的統計而對于單詞順序完全不關心。
詞袋編碼
在sklearn中詞袋被稱為CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() string1 = "hello world" string2 = "i love you" string3 = "how are you" email_list = [string1, string2, string3] # 使用vectorizer擬合數據。這里指出語料庫中的所有單詞,然后對每個單詞分配數字 bag_of_words = vectorizer.fit(email_list) # 進行轉換,挑出語料庫中的出現的單詞,以及每個單詞出現的次數 bag_of_words = vectorizer.transform(email_list)用于機器學習的文本處理
停止詞(stopwords)
停止詞一般來說就是出現頻率非常高的低信息單詞,比如說:I、and、you、have等。
在文字分析前一個常見的預處理步驟,就是處理前去除停止單詞。
從NLTK中獲取停止詞
NLKT是自然語言工具包
from nltk.corpus import stopwords # 注意使用這個語句之前一定要已經導入了語料庫 sw = stopwords.words("english")詞干化以合并詞匯
用于機器學習的文本還可以變得進一步簡潔一些。比如說下圖所示的左側的五個response單詞,在文本中實際上并沒有太大差別。都是指代對于某個東西的回應。因此我們可以將5維數據詞干化為1維數據,用右側單詞進行指代。
至于哪些單詞可以詞干化用于提取,這個事情比較棘手。好在我們不必過于關心。一些語言學家和計算機專家已經為我們建立好了函數。能夠很好的指出單詞詞干。
使用NLTK進行詞干化
NLTK中有多重可以用于詞干化的函數,這里演示一下使用snowball
from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("english")# 示例 stemmer.stem("responsivity")注意: 我們應當對句子先進行詞干化處理之后再放入詞袋之中
如果反過來操作,詞袋中就會有很多重復的詞匯,這和我們簡潔化的初衷是不相符的。而且詞干化只是對字符串進行操作。如果先用詞袋處理變成矩陣在對其進行詞干化操作起來會更為復雜。
Tf Idf表達
如上圖所示,Tf是指術語頻率,他的意思是每個單詞,每個術語出現的頻率,與詞袋非常相同,都是加權之后的結果。比如說某個單詞出現一次,比某個單詞出現10次的權重少10倍。
Idf是指在整個語料庫中的所有出現的文件頻率進行加權。但要注意的是:Idf對于語料庫中的較少出現的詞匯加權更大。
之所以會這樣是因為那些低頻詞匯往往更能顯示出特征信息。比如在一個機械和土木的人對話中,機械可能會更多的提到零件這個詞匯,而土木的可能會提一些結構力學等。雖然這些詞可能都是不經意談到的低頻詞匯,但往往可以代表每個人的身份特征。
Tf-idf編碼
TfidfVectorizer的作用是可以把一大堆文檔轉換成TF-IDF特征的矩陣。他還可以去除停止詞,下面用代碼來具體說明一下:
# word_data是一堆英語句子所組成的列表from sklearn.feature_extraction.text import TfidfVectorizer# 這里我們只需要注明停止詞就可以了,不需要導入nltk vector = TfidfVectorizer(stop_words = 'english')# fit_transform的作用是學習詞匯并進行idf加權,返回一個文本矩陣 vector.fit_transform(word_data)# get_feature_names() 訪問單詞和特征數字之間的映射,該函數返回一個包含詞匯表所有單詞的列表 tf = vector.get_feature_names() print len(tf)更多精彩內容,歡迎關注我的微信公眾號:數據瞎分析
總結