任務(wù):
- 詞袋模型:離散、高維、稀疏;
- 分布式表示:連續(xù)、低維、稠密。word2vec詞向量原理并實(shí)踐,用來表示文本;
詞袋模型
詞集模型: 單詞構(gòu)成的集合,集合中每個(gè)元素都只有一個(gè);
詞袋模型:在詞集的基礎(chǔ)上,如果一個(gè)單詞在文檔中出現(xiàn)不止一次,統(tǒng)計(jì)其出現(xiàn)的次數(shù);
詞袋在詞集的基礎(chǔ)上增加了頻率的維度,詞集關(guān)注的是單詞是否存在,詞袋增加關(guān)注了單詞出現(xiàn)的頻率;
當(dāng)我們要對一篇文章進(jìn)行特征化,最常見的方式就是詞袋,利用sklearn實(shí)踐詞袋模型:
from sklearn.feature_extraction.text import CountVectorizer
corpus = ['This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?']
# 實(shí)例化分詞對象
vectorizer = CountVectorizer(min_df=1)
# 將文本進(jìn)行詞袋處理
X = vectorizer.fit_transform(corpus)
# 獲取對應(yīng)的特征名稱
print(vectorizer.get_feature_names())
# 詞袋化
corpus_X = X.toarray()
當(dāng)使用現(xiàn)有的詞袋特征對其他文本進(jìn)行特征提取時(shí),可利用詞袋的特征空間,在針對其它文本進(jìn)行詞袋處理時(shí),,直接使用現(xiàn)有的詞匯表:
# 定義詞袋的特征空間,便于使用現(xiàn)有的詞袋的特征,對其他文本進(jìn)行特征提取
vocabulary = vectorizer.vocabulary_
# 使用現(xiàn)有的詞匯表對其他文本進(jìn)行詞袋處理
new_vectorizer = CountVectorizer(min_df=1, vocabulary=vocabulary)
Word2Vec
word2vec 是 Google 于 2013 年開源推出的一個(gè)用于獲取 word vector 的工具包;
word2vec是用來生成詞向量的工具,而詞向量與語言模型有著密切的關(guān)系
- 原理知識
- sigmoid函數(shù)
- 邏輯回歸
- Bayes 公式
- Huffman 編碼
- Huffman 樹
- Huffman 樹的構(gòu)造
- Huffman 編碼
預(yù)備知識原理參考鏈接:https://blog.csdn.net/itplus/article/details/37969635
- 統(tǒng)計(jì)語言模型
統(tǒng)計(jì)語言模型用來計(jì)算一個(gè)句子的概率的概率模型,通?;谝粋€(gè)語料庫來構(gòu)建,假設(shè)
表示由
個(gè)詞
按順序構(gòu)成的一個(gè)句子,則
的聯(lián)合概率:
則為這個(gè)句子的概率
- 計(jì)算語言模型的參數(shù)
- n-gram模型
- 神經(jīng)概率語言模型
在NLP任務(wù)中,機(jī)器無法理解文字的含義,首先需要做的就是將語言數(shù)學(xué)化——詞向量,其中one-hot是一種最簡單的詞向量
但是one-hot存在缺點(diǎn),容易受到維度災(zāi)難的困擾,尤其當(dāng)用在Deep Learning場景時(shí);one-hot還不能很好的刻畫詞與詞之間的相似性。
背景原理知識參考鏈接:https://blog.csdn.net/itplus/article/details/37969817
- word2vec中用到的兩個(gè)重要模型
CBOW模型,Skip-gram模型
CBOW-Skip-gram網(wǎng)絡(luò)結(jié)構(gòu)
其中代表當(dāng)前詞語位于句子的位置t
CBOW-Skip-gram模型原理參考鏈接:https://blog.csdn.net/itplus/article/details/37969979
https://blog.csdn.net/itplus/article/details/37998797
- word2vec實(shí)踐:利用gensim實(shí)現(xiàn)
- 第一步:獲得數(shù)據(jù),建立語料庫
- 第二步:分詞
- 第三步:訓(xùn)練
- 第四步:查看效果
選擇《人民的名義》的小說原文作為語料,原文鏈接:這里
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 18 19:53:52 2019
@author: leo
"""
import jieba
import jieba.analyse
from gensim.models import word2vec
# 讀數(shù)據(jù)
def get_file(path):
with open(path) as f:
document = f.read()
return document.replace('\n','').replace('\t','').replace('\r','').replace(' ','').replace(' ','')
data = get_file('/Users/leo/Desktop/in_the_name_of_people.txt')
# 加入人名
jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田國富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('鐘小艾', True)
jieba.suggest_freq('陳巖石', True)
jieba.suggest_freq('歐陽菁', True)
jieba.suggest_freq('易學(xué)習(xí)', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孫連城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁義珍', True)
jieba.suggest_freq('鄭西坡', True)
jieba.suggest_freq('趙東來', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('趙瑞龍', True)
jieba.suggest_freq('林華華', True)
jieba.suggest_freq('陸亦可', True)
jieba.suggest_freq('劉新建', True)
jieba.suggest_freq('劉慶祝', True)
# 分詞
data_cut = list(jieba.cut(data))
model = word2vec.Word2Vec([data_cut], hs=1, min_count=1, window=3, size=100)
# 找出沙瑞金最相近的5個(gè)詞
req_count = 5
for key in model.wv.similar_by_word('丁義珍', topn = 100):
if len(key[0]) == 3:
if req_count == 0:
break
req_count -= 1
print(key[0], key[1])
# 查看兩個(gè)詞向量相似程度
print(model.wv.similarity('沙瑞金', '高育良'))
存在問題:
當(dāng)jiebe.cut為全模式分詞時(shí),此時(shí)輸出的精確度中不存在人名

