gensim-Python 计算 tfidf ,数据较大,报错memory error

问题描述

Python 计算 tfidf ,数据较大,报错memory error

我的工作环境是,win7,python2.7.10,gensim

任务内容是根据商品信息(所属类目、分词)来确定商品间的相似度。
商品信息由50w行文本组成。
例如:
自左向右,分别为,商品ID/所属类目ID/商品标题分词

29 155 123950,53517,106068,59598,7503,171811,25618,147905,203432
49 228 73035,33202,116593,48909,92233,181255,127004,38910
59 284 123950,38910,22837,5026,15459,47776,158346,101881,131272

我基本套用了网上的gensim教程中对求解相似度的程序。问题出在最后求相似度的时候,求大侠指教!!很急!!

******首先是用于将商品标题分词建成词袋(稀疏矩阵)的程序1,花了2分多,运行结束******

 # -*- coding: utf-8 -*-
# 激活日志
import logging,time
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

start=time.clock()

# 导入gensim工具包
from gensim import corpora, models, similarities

# 数据源
fsource='C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\dim_items_terms.csv'

# 文件目录
fcontent='C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\test01_with_lis\'

# 读入本地文件,用readlines()方法自动将文件内容分析成一个行的列表
f0=open(fsource)
lines=f0.readlines()
terms_list=[]
for line in lines:
    line=line.strip('n') # 去除当前行文本末尾的换行符
    terms_single_line=line.split(',') # 按“,”分割当前行文本 es:['48909,53517,116593,55095']->['48909','53517','116593','55095']
    terms_list.append(terms_single_line) # 向列表尾部添加新列表元素
f0.close()

# 去除语料库中仅出现过一次的分词
from collections import defaultdict
frequency = defaultdict(int)
for text in terms_list:
        cnt_single=defaultdict(int)
        for token in text:
            frequency[token] += 1

terms_list = [[token for token in text if frequency[token] > 1] for text in terms_list]

# 描述同一商品的分词去重
terms_list_qc=[]
for text in terms_list:
    cnt_single=defaultdict(int)
    terms_list_qc_item=[]
    for token in text:
        cnt_single[token]+=1
        if(cnt_single[token]<=1):
            terms_list_qc_item.append(token)
    terms_list_qc.append(terms_list_qc_item)

dictionary = corpora.Dictionary(terms_list)
    # 通过 gensim.corpora.dictionary.Dictionary 给所有在语料库中出现过的分词各分配唯一的整型ID
    # 通过扫描整个文本,收集词汇数与相应的统计。
    # 可以通过 dictionary 了解到处理的预料中所包含的不同分词数以及分词与ID间的映射关系(dictionary.token2id)
dictionary.save(fcontent+'dim_items_terms.dict')
    # 保存 dictionary ,以备后用
corpus = [dictionary.doc2bow(text) for text in terms_list]
    # 函数 doc2bow() 可以统计出每个不同分词的出现次数,将该分词转换为其所对应的整型ID,并返回一个稀疏矩阵
    # 稀疏矩阵示例:[(2,1),(3,1)],可理解为该矩阵所对应的文本中,ID为2的分词出现1次,ID为3的分词出现1次
corpora.MmCorpus.serialize(fcontent+'dim_items_terms.mm', corpus)
    # 序列化向量空间语料库并保存到本地,以备后用

end=time.clock()
print "Time Cost for Program 00_a_trim_items_terms_to_sparse_matrix.py: %f s" % (end-start)

## 然后是程序2,词袋->tfidf->LSI,LSI可要可不要,跑了三分多

 # -*- coding: utf-8 -*-
import logging,time
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

start=time.clock()

from gensim import corpora, models, similarities

# 文件目录
fcontent='C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\test01_with_lis\'

# 使用 step1 中创建的用向量流表示文档的语料库
dictionary = corpora.Dictionary.load(fcontent+'dim_items_terms.dict')
corpus = corpora.MmCorpus(fcontent+'dim_items_terms.mm')

# 使用 step1 中创建的语料库来初始化此转换模型
tfidf = models.TfidfModel(corpus)

# 将词袋整数计数表示的向量转换为TFIDF实数权重表示方法
corpus_tfidf = tfidf[corpus]

# 初始化一个LSI转换
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2)
# 在原始语料库上加上双重包装: bow->tfidf->fold-in-lsi
corpus_lsi = lsi[corpus_tfidf]
    # tfidf语料通过LSI (Latent Sematic Indexing,潜在语义索引)
    # 变换为一个隐含语义的2D空间(2D,通过设置num_topics=2来完成)

# LSI模型持久化
lsi.save(fcontent+'dim_items_terms_model.lsi')
# lsi = models.LsiModel.load('C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\dim_items_terms_model.lsi')

end=time.clock()
print "Time Cost for Program 00_b_bagofwords_to_tfidf_to_lsi.py: %f s" % (end-start)

最后是实际计算商品间相似度的程序三,这个用LSI模型来比对的话,2k行要跑四五十分钟,但我的数据量有50w。用tfidf模型来算直接报memory error 不给跑

 # -*- coding: utf-8 -*-
import logging,time
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

start=time.clock()

from gensim import corpora, models, similarities

# 数据源
fsource='C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\dim_items_terms_pre.csv'
# 文件目录
fcontent='C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\fomal\test01_with_lis\'

# 可以如下面三行所示根据step1中创建的语料库来初始化lsi模型,亦可直接使用step2中已初始化的lsi模型
dictionary = corpora.Dictionary.load(fcontent+'dim_items_terms.dict')
corpus = corpora.MmCorpus(fcontent+'dim_items_terms.mm')

tfidf = models.TfidfModel(corpus)
#lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2)

# lsi = models.LsiModel.load(fcontent+'dim_items_terms_model.lsi')

index = similarities.MatrixSimilarity(tfidf[corpus])
# 将语料库转换到LSI空间并对它进行索引
#index = similarities.MatrixSimilarity(lsi[corpus])
    # 百万文档以上,内存不足时可以使用similarities.Similarity类

# 索引的存储
index.save(fcontent+'dim_items_terms_tfidf.index')
# index = similarities.MatrixSimilarity.load('C:\Users\Administrator\Desktop\data_after_deal\for_python_deal\dim_items_terms_pre.index')

# 查询对象doc -> 创建doc的稀疏矩阵 -> 将查询转换入LSI空间
# 读入本地文件,用readlines()方法自动将文件内容分析成一个行的列表
f0=open(fsource)
lines=f0.readlines()
#terms_list=[]
f1=open(fcontent+'out_recordid_tfidf.txt',"w")
f2=open(fcontent+'out_cosine_tfidf.txt',"w")
for line in lines:
    line=line.strip('n') # 去除当前行文本末尾的换行符
    doc = line
    vec_bow = dictionary.doc2bow(doc.split(','))
    vec_lsi = tfidf[vec_bow]
    sims = index[vec_lsi]
    # 获得查询文档相对于其他经过索引的文档的相似度
    # 余弦方法返回的相似度在[-1,1]之间,越大越相似
    # 以下将相似性倒序排列
    sims = sorted(enumerate(sims), key=lambda item: -item[1])
    for i in range(500):
        f1.write(str(sims[i][0]+1)+',')# 商品记录序号
        f2.write(str(sims[i][1])+',')# 相似度
    f1.write('n')
    f2.write('n')
f0.close()
f1.close()
f2.close()

end=time.clock()
print "Time Cost for Program 00_c_get_sim_itemsid_top_fh.py: %f s" % (end-start)

解决方案

内存不够的情况,一般就是要升级内存,还更强劲的机器等来处理了。

解决方案二:

没有人了么==好心塞==快来人啊

时间: 2024-09-14 20:43:11

gensim-Python 计算 tfidf ,数据较大,报错memory error的相关文章

大数据-orcale大量数据分组查询报错求大神指点

问题描述 orcale大量数据分组查询报错求大神指点 对一个表数据进行分组查询,但是数据量太大了,当时是3000w条,跑着就报错了,数据库内部错误,也不是很懂.想请教下group by的时候是否数据量太多会报错,如果是它可以承受多大的数据量分组查询. 解决方案 肯定会报错,数据量大就会请求超时 解决方案二: 建议使用索引,给需要分组的字段加索引 解决方案三: 你可以试试根据你当前数据库的配置情况,进行分组查询的时候,使用多线程的方式进行查询 例如: select /*+ parallel(t,1

大数据开发套件中数据同步-日志报错回滚信息的一些问题总结

在使用大数据开发套件时最常用的就是数据同步模块,工单里最常见的问题就是其中数据同步的问题,这里总结一些常见一些从MaxCompute(原名ODPS)到其他数据源的同步任务报错案例,主要是日志中出现数据回滚写入的问题. 那首先看下日志中数据回滚的原因,当数据写入rds或者hybridDB等一些支持事务的数据库中,数据批量写入,一旦由于各种原因没有写入成功,这个批次的数据会回滚重新写入,如果再次写入失败,就会报脏数据的错误导致任务失败.数据写入失败可能是以下原因导致回滚.1,脏数据(数据值超过数据类

SQLCE数据库,在插入了大128M数据的时候报错

问题描述 SQLCE数据库,在插入了大128M数据的时候报错 具体过程是这样的,我用VS2005平台的VB.NET语言开发WINCE5的项目,首先创建一个数据库(ABC.SDF),再用"CREATE TABLE"创建了31个"DAY1~DAY31"的表,并创建了索引,然后第隔200ms,用"INSERT INTO "按当前日期入对应的表格插入120BYTE的字符,一天大概增加48M,前几天都很正常,最近报了上述错误"The databa

oracle数据库-oracle 创建的dblink导入数据不成功报错

问题描述 oracle 创建的dblink导入数据不成功报错 执行数据导入时报:ORA-24777: 不允许使用不可移植的数据库链路

ssh整合-java Web 中提交数据信息时 报错

问题描述 java Web 中提交数据信息时 报错 Entering nullPropertyValue [target=[com.shyou.action.BusinessShopAction@1178dc3, com.opensymphony.xwork2.DefaultTextProvider@cbd684], property=bShop] Error setting expression 'bShop.personCharge' with value '[Ljava.lang.Stri

.net-C# webservie 传递一个大型byte数据,服务报错

问题描述 C# webservie 传递一个大型byte数据,服务报错 C# webservie 传递一个大型byte数据(几十M),服务报错下面是异常信息 System.ServiceModel.CommunicationException: 接收对 h**p://****:6941/UploadData.asmx 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见

mysql-测试hibernate框架自动建表并保存数据,没报错,但数据只保存了一部分

问题描述 测试hibernate框架自动建表并保存数据,没报错,但数据只保存了一部分 解决方案 因为你去给Product这个对象创建三个实例,pro.pro2.pro3,对吧,然后你不停的给pro去赋值(pro.setName()),最后pro的最后一个值把前两个覆盖掉了,所以只添加了一个棉花糖.正确的方式是要给每个,你把第29行改成pro2.setName():30行pro2.setDir():33行pro3.setName():34行pro3.setDir(),就万事大吉了,祝你成功! 解决

sqoop从MySQL导入数据到hive报错 class not found

问题描述 sqoop从MySQL导入数据到hive报错 class not found 解决方案 sqoop 导入oracle 报错 Imported Failed : Attempted to generate class with no columns问题解决办法mysql启动报错 MySQL manager or server PID file could not be found! [FAILED]启动HIVE 服务报错 HWI WAR file not found 解决方案二: 您好,

段错误-在ubuntu环境下执行python程序,报错 segment error

问题描述 在ubuntu环境下执行python程序,报错 segment error 请教各位朋友们,应该如何查看出错的代码文件和行数呢,只报错segment error,无法知道程序哪里错了.而且程序本身很长,大概几千行代码,没有错误定位很难调试. 请问如何打印出具体的错误信息呢,或者如何调试呢? 在此,先谢谢各位朋友们了. 解决方案 生成dump文件,然后gdb调试.看堆栈. 不过你python程序还可以对print打印信息来分析. 解决方案二: segment error 往往是指针的问题