一、將語料庫轉化為向量(gensim)
在對語料庫進行基本的處理後(分詞,去停用詞),有時需要將它進行向量化,便於後續的工作。
from gensim import**結果為:corpora,similarities,models
import
jieba
#第一步:確定語料庫的語料和要進行判斷的句子:
#wordlist作為語料庫,語料庫中有三句話,相當於三篇文章.
wordlist=['
我喜歡程式設計
','我想變漂亮
','今天吃午飯了嗎']
sentenses='
我喜歡什麼'#
第二步:使用語料庫建立詞典,也就是給預料庫中的每個單詞標上序號,類似:首先進行中文分詞
text=[[word for word in jieba.cut(words) ]for words in
wordlist]
dictionary =corpora.dictionary(text)#這一步給每個詞賦予了編號
(dictionary)
#第三步,對語料中的每個詞進行詞頻統計,doc2bow是對每一句話進行詞頻統計,傳入的是乙個list
#corpus得到的是乙個二維陣列[[(0, 1), (1, 1), (2, 1)], [(3, 1), (4, 1)], [(5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]],意思是編號為0的詞出現的頻率是1次,編號為2的詞出現的頻率是1次
corpus=[dictionary.doc2bow(word) for word in
text]#這一步將用字串表示的文件轉換為用詞id和詞頻來表示
print(corpus)#(詞的id號,詞頻)
我們利用gensim.corpora.dictionary.dictionary類為每個出現在語料庫中的單詞分配了乙個獨一無二的整數編號。doc2bow函式主要用於讓編了號的語料庫變為bow詞袋模型,對每個不同單詞的出現次數進行了計數,然後以稀疏向量的形式返回結果。上述**的corpus就是語料庫的詞袋模型,其中,每乙個子列表都表示一篇文章。
基於這個處理好了的含有三篇文章的訓練文件,我們可以訓練乙個tfidf模型,就是下面**的第四步;
然後經過第五步,我們將上述用詞頻表示文件向量表示為乙個用tf-idf值表示的文件向量
#**中的tfidf,和sen_tfidf結果分別是語料庫和新句子的tfidf向量化表示。很多模型就是基於tf-idf來做的,比如lsi,lda等。現在每個句子就變成了[(詞id號,idf值),(詞id號,idf值)....]這樣的稀疏表示形式。第四步:使用corpus訓練tfidf模型
model=models.tfidfmodel(corpus)
#要是想要看tfidf的值的話可以:
tfidf=model[corpus]
'''tfidf的結果是語料庫中每個詞的tfidf值
[(0, 0.5773502691896258), (1, 0.5773502691896258), (2, 0.5773502691896258)]
[(3, 0.7071067811865475), (4, 0.7071067811865475)]
[(5, 0.4472135954999579), (6, 0.4472135954999579), (7, 0.4472135954999579), (8, 0.4472135954999579), (9, 0.4472135954999579)]
'''#
第五步:為tfidf模型中的每個句子建立索引,便於進行相似度查詢,傳入的時候語料庫的tfidf值
similarity=similarities.matrixsimilarity(tfidf)
#第六步,處理要比較的句子,首先分詞,其次獲得詞頻,jieba只能傳入字串
sen=[word for word in
jieba.cut(sentenses)]
sen2=dictionary.doc2bow(sen)
#然後計算它的tfidf值
sen_tfidf=model[sen2]
#獲得與所有句子的相似度,sim輸出的是乙個陣列
sim=similarity[sen_tfidf]
然後,基於這個用tfidf值表示的向量,我們又可以訓練乙個lsi模型,有了這個lsi模型,我們就可以將文件對映到乙個二維的topic空間中,**如下:
from gensim import結果為:corpora,similarities,models
import
jieba
documents = ["
shipment of gold damaged in a fire
","delivery of silver arrived in a silver truck
","shipment of gold arrived in a truck"]
texts = [[word for word in document.lower().split()] for document in
documents]
#基於分詞結果,給詞編號,建詞袋模型
dictionary =corpora.dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in
texts]
#基於詞id號和詞頻建tfidf向量
tfidf =models.tfidfmodel(corpus)
corpus_tfidf =tfidf[corpus]
for doc in
corpus_tfidf:
(doc)
#基於tfidf向量建lsi模型
lsi = models.lsimodel(corpus_tfidf, id2word=dictionary, num_topics=2)
corpus_lsi =lsi[corpus_tfidf]
for doc in
corpus_lsi:
print(doc)
很奇怪,用英文的話可以顯示出主題1,2的值,但是中文只顯示乙個,是因為lsi本身就不適用中文嗎?
NLP關鍵詞提取
1 tf idf詞頻逆序詞頻 2 textrank 基於圖的模型,網上很多測評說它不一定強過tf idf,其實對於沒有標註資料的情況,感覺評判好壞真的很艱難。3 lda 4 word2vec 聚類 這個方法是看以為總結的,感覺具體的實施方案還是得自己實踐,不過個人覺得這個方法有點麻煩。主要流程如下 ...
NLP 關鍵詞提取演算法
一 提取關鍵字技術簡介 關鍵字提取技術一般也可以分為有監督和無監督 分別是tf idf演算法 textrank演算法和主題模型演算法 包括lsa lsi lda等 tf idf演算法 tf idf term frequency inverse document frequency,詞頻 逆文件頻次演...
NLP學習路徑(五) NLP關鍵詞提取演算法
2 tf idf演算法 無監督 tf idf演算法是一種基於統計的計算方法,常用於評估在乙個文件集中乙個詞對某份文件的重要程度。tf演算法是統計乙個詞在一篇文件 現的頻次 idf演算法是統計乙個詞在文件集的多少個文件 現,基本思想是 如果乙個詞在文件 現的次數越少,則其對文件的區分能力也就越強 要對...