part 1 for beginners bag of words
數(shù)據(jù)讀取
train = pd.read_csv("labeledTrainData.tsv", header=0, \ delimiter="\t", quoting=3)
>>> train.shape
(25000, 3)
數(shù)據(jù)有25000行,三列.數(shù)據(jù)清洗和文本處理
由于數(shù)據(jù)中有html標(biāo)簽,引入BeautifulSoup庫進(jìn)行清理,同時使用正則表達(dá)式,把標(biāo)點(diǎn)符號和數(shù)字替換為空格,然后出去所有的大寫字母,方便后來的單詞處理 (例如Love和love,實(shí)質(zhì)是一個單詞,如果不把大小字母處理,可能會識別為兩個單詞),還要去除 stop words,因?yàn)?stop words 出現(xiàn)的頻率高,但是意義不大.關(guān)鍵代碼如下:
example1 = BeautifulSoup(train["review"][0]).get_text()
letters_only = re.sub("[^a-zA-Z]", " ")
lower_case = letters_only.lower()
words = lower_case.split()
然后把每一個review的處理后的詞造成,放入list中使用詞袋模型創(chuàng)建特征向量
Sentence 1: "The cat sat on the hat"
Sentence 2: "The dog ate the cat and the hat"
From these two sentences, our vocabulary is as follows:
M = { the, cat, sat, on, hat, dog, ate, and }
集合M稱為詞匯表,詞匯表是從所有的訓(xùn)練文本中提取出來的詞匯的集合
Sentence 1: { 2, 1, 1, 1, 1, 0, 0, 0 }
Sentence 2: { 3, 1, 0, 0, 1, 1, 1, 1}
把每一個Sentence轉(zhuǎn)化為一個向量
詞匯表的長度n撮奏,就是每一個Sentence向量的維度
這就是使用詞袋模型創(chuàng)建特征向量的基本方法
此時統(tǒng)計review樣本中的詞匯惜论,找到詞匯表M个榕,然后按照上述方法,將每一個review轉(zhuǎn)化為特征向量(特征向量的維度取決于詞匯表的長度n)隨機(jī)森林算法
有了每一個review的特征向量,還有每一個review的sentiment,采用隨機(jī)深林算法
forest = forest.fit( train_data_features, train["sentiment"] )
算法完成以后封恰,可以做預(yù)測
result = forest.predict(test_data_features)
其中test_data_features無sentiment標(biāo)簽
output = pd.DataFrame(data={"id":test["id"], "sentiment":result})
part 2 word vectors
問題引入
什么是one-hot編碼,該編碼有什么缺點(diǎn)褐啡?
任何一門語言诺舔,都是由一堆的詞組成,所有的詞备畦,構(gòu)成了一個詞匯表低飒。詞匯表,可以用一個長長的向量來表示懂盐。詞的個數(shù)褥赊,就是詞匯表向量的維度。那么莉恼,任何一個詞拌喉,都可以表示成一個向量,詞在詞匯表中出現(xiàn)的位置設(shè)為1俐银,其它的位置設(shè)為0尿背。但是這種詞向量的表示,詞和詞之間沒有交集捶惜,用處不大田藐。
為什么需要word2vec,word2vec主要是干什么用的吱七?
為了克服one-hot編碼的缺點(diǎn),word2vec利用上下文信息推測詞的意思坞淮,這種方法訓(xùn)練出來的詞,相似的詞陪捷,詞的特征向量之間的夾角越小回窘。
Word2Vec 的訓(xùn)練模型,是具有一個隱含層的神經(jīng)元網(wǎng)絡(luò)市袖,有兩種訓(xùn)練方法
CBOW (Continuous Bag-of-Words Model) 和 Skip-gram (Continuous Skip-gram Model)
CBOW啡直,它的做法是烁涌,將一個詞所在的上下文中的詞作為輸入,而那個詞本身作為輸出酒觅,也就是說撮执,看到一個上下文,希望大概能猜出這個詞和它的意思舷丹。
Skip-gram抒钱,它的做法是,將一個詞所在的上下文中的詞作為輸出颜凯,而那個詞本身作為輸入谋币,也就是說,給出一個詞症概,希望預(yù)測可能出現(xiàn)的上下文的詞
part2正式內(nèi)容
word2vec介紹
word2vec由谷歌在2013年發(fā)布,balabala...............如何在python中使用
如何安裝蕾额,此處省略。彼城。诅蝶。。募壕。调炬。。舱馅。訓(xùn)練模型缰泡,保存訓(xùn)練后的模型,測試
主要代碼如下:
model = word2vec.Word2Vec(sentences, workers=num_workers, \
size=num_features, min_count = min_word_count, \
window = context, sample = downsampling)
Word2Vec.load()
model_name = "300features_40minwords_10context"
model.save(model_name)
測試模型
>>model.doesnt_match("man woman child kitchen".split())
'kitchen'
model.most_similar("man")
[(u'woman', 0.6056041121482849), (u'guy', 0.4935004413127899), (u'boy', 0.48933547735214233), (u'men', 0.4632953703403473), (u'person', 0.45742249488830566), (u'lady', 0.4487500488758087), (u'himself', 0.4288588762283325), (u'girl', 0.4166809320449829), (u'his', 0.3853422999382019), (u'he', 0.38293731212615967)]