1. 程式人生 > >GENSIM 使用筆記1 --- 語料和向量空間

GENSIM 使用筆記1 --- 語料和向量空間

1 本篇說明

本篇部落格來源於GENSIM官方向導文件的第一章,主要供自己後續的翻閱,並通過分享帶給諸位網友一個小小的參照。

從字串到向量

在這一小節當中,將會講述如何通過gensim,將一段文字以向量的形式表示。
首先我們看一下我們的基本文件形式:

documents = [
    '拍照反光一直是攝影愛好者較為苦惱的問題',
    '尤其是手機這種快速拍照裝置的成像效果總是難以令人滿意',
    '特別是抓拍的珍貴照片',
    '遇上反光照片基本作廢',
    '而索尼最近研發的整合偏振片感測器',
    '似乎可以有效的解決拍照反光的問題'
]

和原始教程不一樣,這裡我不完全參考他的文件,並且換用了中文作為示例,這一點更加貼合我們實際的使用。

在這裡,我們簡單的表示了下,將每篇文件(這裡只是一句話,請根據實際情況替換)表示為了一個字串,最後用一個list表示所有的文件,也就是我們的語料庫了。

隨後,我們需要將他進行分詞,在這裡我是用了jieba中文分詞,如果有其他的大家可以自行替換,如果有什麼特殊的功能(如停用詞等)也可以自行參照修改。

texts = [jieba.lcut(document) for document in documents ]

此時,需要進行了詞典的構建,如果需要檢視具體的對照資訊,也可以print下。具體的方式如下:

#構造字典 並 儲存和載入
dictionary = corpora.Dictionary(texts)
dictionary.save('mydict.dic'
) print 'Tokens:Id' print dictionary.token2id new_dictionary = corpora.Dictionary.load('mydict.dic') print(new_dictionary)

那麼現在我可以引入一些新的文字,並且通過他生成對應的向量(注意這裡保證你的詞,已經出現過在之前的語料庫之中了,否則多出的這些詞是不會統計的)

#構造新的文字並且獲得他的向量
new_document = "索尼可以有效解決拍照的問題"
new_vector = dictionary.doc2bow(jieba.lcut(new_document))
print
'the vector of "%s": (tokenid,frequency)' % new_document print new_vector

使用doc2bow這個功能,只會簡單的做一些類似於wordcount的東西,並且返回的是一些元組,就是(詞的id,頻次)的一個數組,這裡需要特別注意下。

最後,我們通過之前的字典和預料,生成一個符合我們格式的語料庫

#生成語料庫
corpus = [ dictionary.doc2bow(text) for text in texts]

當我們訓練好了一個詞典以後,一般希望將其記錄到磁碟當中,方便後續使用,而不是每次都單獨訓練,gensim提供了多種序列化方式,在這裡我只選擇其中一種進行說明:

#序列化
corpora.MmCorpus.serialize('corpus.mm', corpus)
#重新載入預料
new_corpus = corpora.MmCorpus('corpus.mm')
print(len(new_corpus))

如上,就將語料庫序列化和反序列化了

其他

原教程,還有一大塊是關於如何對接numpy 以及如何節約記憶體的,這裡就不多說了,有需要的自行研究

完整程式碼

#coding:utf-8
import gensim
import jieba
from gensim import corpora
documents = [
    '拍照反光一直是攝影愛好者較為苦惱的問題',
    '尤其是手機這種快速拍照裝置的成像效果總是難以令人滿意',
    '特別是抓拍的珍貴照片',
    '遇上反光照片基本作廢',
    '而索尼最近研發的整合偏振片感測器',
    '似乎可以有效的解決拍照反光的問題'
]
texts = [jieba.lcut(document) for document in documents]
#構造字典 並 儲存和載入
dictionary = corpora.Dictionary(texts)
dictionary.save('mydict.dic')
print 'Tokens:Id'
print dictionary.token2id
new_dictionary = corpora.Dictionary.load('mydict.dic')
print(new_dictionary)

#構造新的文字並且獲得他的向量
new_document = "索尼可以有效解決拍照的問題,佳能就不可以"
new_vector = dictionary.doc2bow(jieba.lcut(new_document))
print 'the vector of "%s": (tokenid,frequency)' % new_document
print new_vector

#生成語料庫
corpus = [ dictionary.doc2bow(text) for text in texts]
#序列化
corpora.MmCorpus.serialize('corpus.mm', corpus)
#重新載入預料
new_corpus = corpora.MmCorpus('corpus.mm')
print(len(new_corpus))

Reference