NLP(五) 關鍵詞提取補充(語料庫和向量空間)

2022-04-06 06:14:29 字數 3300 閱讀 3668

一、將語料庫轉化為向量(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)#這一步給每個詞賦予了編號

print

(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值表示的文件向量

#

第四步:使用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,和sen_tfidf結果分別是語料庫和新句子的tfidf向量化表示。很多模型就是基於tf-idf來做的,比如lsi,lda等。現在每個句子就變成了[(詞id號,idf值),(詞id號,idf值)....]這樣的稀疏表示形式。

然後,基於這個用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:

print

(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演算法是統計乙個詞在文件集的多少個文件 現,基本思想是 如果乙個詞在文件 現的次數越少,則其對文件的區分能力也就越強 要對...