任務:
- 詞袋模型:離散燃领、高維士聪、稀疏;
- 分布式表示:連續(xù)柿菩、低維戚嗅、稠密。word2vec詞向量原理并實踐枢舶,用來表示文本懦胞;
詞袋模型
詞集模型: 單詞構成的集合,集合中每個元素都只有一個;
詞袋模型:在詞集的基礎上,如果一個單詞在文檔中出現(xiàn)不止一次,統(tǒng)計其出現(xiàn)的次數(shù);
詞袋在詞集的基礎上增加了頻率的維度,詞集關注的是單詞是否存在,詞袋增加關注了單詞出現(xiàn)的頻率;
當我們要對一篇文章進行特征化,最常見的方式就是詞袋,利用sklearn
實踐詞袋模型:
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?']
# 實例化分詞對象
vectorizer = CountVectorizer(min_df=1)
# 將文本進行詞袋處理
X = vectorizer.fit_transform(corpus)
# 獲取對應的特征名稱
print(vectorizer.get_feature_names())
# 詞袋化
corpus_X = X.toarray()
當使用現(xiàn)有的詞袋特征對其他文本進行特征提取時,可利用詞袋的特征空間,在針對其它文本進行詞袋處理時,,直接使用現(xiàn)有的詞匯表:
# 定義詞袋的特征空間,便于使用現(xiàn)有的詞袋的特征,對其他文本進行特征提取
vocabulary = vectorizer.vocabulary_
# 使用現(xiàn)有的詞匯表對其他文本進行詞袋處理
new_vectorizer = CountVectorizer(min_df=1, vocabulary=vocabulary)
Word2Vec
word2vec 是 Google 于 2013 年開源推出的一個用于獲取 word vector 的工具包;
word2vec是用來生成詞向量的工具凉泄,而詞向量與語言模型有著密切的關系
- 原理知識
- sigmoid函數(shù)
- 邏輯回歸
- Bayes 公式
- Huffman 編碼
- Huffman 樹
- Huffman 樹的構造
- Huffman 編碼
預備知識原理參考鏈接:https://blog.csdn.net/itplus/article/details/37969635
- 統(tǒng)計語言模型
統(tǒng)計語言模型用來計算一個句子的概率的概率模型躏尉,通常基于一個語料庫來構建后众,假設
表示由
個詞
按順序構成的一個句子胀糜,則
的聯(lián)合概率:
則為這個句子的概率
- 計算語言模型的參數(shù)
- n-gram模型
- 神經(jīng)概率語言模型
在NLP任務中,機器無法理解文字的含義蒂誉,首先需要做的就是將語言數(shù)學化——詞向量教藻,其中one-hot是一種最簡單的詞向量
但是one-hot存在缺點,容易受到維度災難的困擾右锨,尤其當用在Deep Learning場景時括堤;one-hot還不能很好的刻畫詞與詞之間的相似性。
背景原理知識參考鏈接:https://blog.csdn.net/itplus/article/details/37969817
- word2vec中用到的兩個重要模型
CBOW模型,Skip-gram模型
CBOW-Skip-gram網(wǎng)絡結構
其中代表當前詞語位于句子的位置t
CBOW-Skip-gram模型原理參考鏈接:https://blog.csdn.net/itplus/article/details/37969979
https://blog.csdn.net/itplus/article/details/37998797
- word2vec實踐:利用gensim實現(xiàn)
- 第一步:獲得數(shù)據(jù)悄窃,建立語料庫
- 第二步:分詞
- 第三步:訓練
- 第四步:查看效果
選擇《人民的名義》的小說原文作為語料,原文鏈接:這里
#!/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('易學習', 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個詞
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])
# 查看兩個詞向量相似程度
print(model.wv.similarity('沙瑞金', '高育良'))
存在問題:
當jiebe.cut
為全模式分詞時,此時輸出的精確度中不存在人名