使用Gensim計算LSI時兩種語料庫流的實現方式

2021-08-25 09:04:47 字數 1548 閱讀 9234

我對自然語言處理實在不熟,這篇部落格也就當是學習了。

最近需要將乙個待分析物件(乙個軟體專案或者是乙個源**)表示為乙個document,再從自然語言處理的角度計算它們的相似性。免不了要用到lsi這樣的方法。網上介紹gensim中lsi的實現的方法已經很多,也有很多教程指出:如果語料庫特別大,那我們同時載入記憶體是不現實的,這時候就要用到語料庫流的概念,其實也有些文章已經介紹了:但可惜的是,大家似乎都說得不太清楚,我簡單總結了乙個例子,幫助大家在上面那些文章的基礎上理解兩種語料庫流的實現方法:

# -*- coding:utf-8 -*-

from gensim import corpora, models

import numpy as np

class mycorpus(object):

def __init__(self, in_file):

self.in_file = in_file

def __iter__(self):

for line in open(self.in_file):

yield dictionary.doc2bow(line.lower().split())

file_string="語料檔案"

num_topics=128

dictionary = corpora.dictionary(line.lower().split() for line in open(file_string))

print dictionary

once_ids = [tokenid for tokenid, docfreq in dictionary.dfs.iteritems() if docfreq == 1]

dictionary.filter_tokens(once_ids)#去掉只出現一次的詞

dictionary.compactify()

print dictionary#可以看到第二次print的時候dictionary精簡了很多

corpus = [dictionary.doc2bow(line.lower().split()) for line in open(file_string)]#在這種情況下,語料庫是乙個矩陣,每一行對應乙個document

print corpus[1]

corpus = mycorpus(in_file=file_string)#在這種情況下語料庫是乙個物件,我們可以每次取出其乙個向量

for index,vector in enumerate(corpus):

if(index==1):

print vector#可以看到,兩種print的結果是相同的。

tfidf_model = models.tfidfmodel(corpus)

corpus_tfidf = tfidf_model[corpus]

lsi_model = models.lsimodel(corpus_tfidf,id2word=dictionary,num_topics=num_topics)

corpus_lsi = lsi_model[corpus_tfidf]

Unity中使用TimeSpane計算時差

引用命名空間 using system 宣告變數 蝴蝶到達ui目標的時間 public datetime time arriveuitarget 變數賦值 當前時間 butterfly.time arriveuitarget datetime.now 倆個timespane差值,可以得出時差 tod...

使用snprintf時的兩點注意事項

使用snprintf函式時要注意兩點,這是我看過無數使用這個函式的程式設計師絕大部分都存在的兩點隱患 比如 char buf len int n snprintf buf,len,s d s str1,int2,str3 1.snprintf會自動在格式化後的字串尾新增 0,所有格式化長度,也就是第...

使用socket套接字時的兩點經驗

使用socket套接字時的兩點經驗 最近我在使用socket程式設計的工作,總結了2點經驗,希望和大家分享一下。由於是菜鳥,有不對的地方還希望多多指教。第一點經驗就是在建立新的套接字之前還需要呼叫乙個引入ws2 32.dll庫的函式。否則伺服器和客戶端連不上。由於初次使用socket,所以查了很多資...