python实现lfm_Python实现根据评论评分信息预测 (协同过滤,LFM,词向量)
一.数据集
train.dat共393366项,第一维是用户的代号,第二维是商品代号,第三项是用户对该商品的评分,第四项是评论数,第五项是评论内容。
test.dat第一维是用户代号,第二维是商品代号。
二.简单思路及实现过程
这里简单先贴出代码实现,后期再慢慢补上具体过程说明~
1.数据预处理
去除部分无关常用词,这里调用nltk包,将评论词词词根化等,进行评论数据的预处理,存为new dat.dat
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from sklearn.model_selection import train_test_split
def textPrecessing(text):
wordLst = nltk.word_tokenize(text)
filtered = [w for w in wordLst if w not in stopwords.words('english')]
refiltered =nltk.pos_tag(filtered)
filtered = [w for w, pos in refiltered if pos.startswith('NN')]
ps = PorterStemmer()
filtered = [ps.stem(w) for w in filtered]
return " ".join(filtered)
def split_word():
x = []
y = []
with open("E:/project/o/comdata/train.dat", encoding='utf-8') as f:
for data in f.readlines():
data = data.strip("\n").split(" ")
temp = []
temp.append(' '.join(data[0:4]))
text = data[4:]
temp.append(textPrecessing(" ".join(text)))
x.append(' '.join(temp))
with open("E:/project/o/comdata/newdat.dat", "w", encoding='utf-8') as w:
for i in x:
w.write(i)
w.write('\n')
f.close()
w.close()
with open('train.dat',encoding='UTF-8') as file_object: #获取训练集
for j in range(303366):
line = file_object.readline()
if(line):
traindata.append(line.strip('\n').split(' ')[0:4]) #
word=line.strip('\n').split(' ')[4:]
comm=[]
for w in word:
if w not in stoplist:
comm.append(w)
commentdata.append(comm) # get comment information
2.获取对应的用户名-id,物品-id字典,构建用户id-物品id 评分表
useridlist={} #用户名对应序号
itemidlist={} #物品对应序号
num=0
mun=0
uu=0
for item in traindata:
if item[0] in useridlist:
uu+=1
if item[0] not in useridlist:
useridlist[item[0]]=num
num+=1
for item in traindata:
if item[1] not in itemidlist:
itemidlist[item[1]]=mun
mun+=1
scorematr=np.zeros((len(useridlist),len(itemidlist))) #评分表ui
for item in traindata:
i=int(useridlist[item[0]])
j=int(itemidlist[item[1]])
scorematr[i][j]=int(item[2])
3.尝试LFM法
def Lfm(T,k):
alpha = np.float32(0.05)
lambda_ = np.float32(0.08)
m, n = T.shape
u = np.float32(np.random.rand(m,k))
v = np.float32(np.random.ran77dn(k,n))
du=np.float32(0)
dv=np.float32(0)
for t in range(500):
for i in range(m):
for j in range(n):
if math.fabs(T[i][j]) > 1e-4:
err = T[i][j] - np.dot(u[i],v[:,j])
for t in range(k):
du = err * v[t][j] - lambda_ * u[i][t]
dv = err * u[i][t] - lambda_ * v[t][j]
u[i][t] += alpha * du; v[t][j] += alpha * dv
return u,v
#u,v=Lfm(scorearr) print(np.dot(u,v))
四.尝试LDA法/word2vec法基于评论预测
① LDA 模型
dictionary = corpora.Dictionary(commentdata) #建立字典
dictionary.filter_tokens(bad_ids=['i','the','is','and','very','a','an','had','about','for','it','if','of','to'])
dictionary.filter_extremes(no_above=40/100)
#dictionary.filter_n_most_frequent(8)
print(dictionary.token2id) #打印字典表
corpus = [dictionary.doc2bow(text) for text in commentdata]
print(corpus[3:5])
print("corpus----")
lda=LdaModel(corpus=corpus,id2word=dictionary,num_topics=20)
# 训练LDA模型
lda.save("./lda.model")
# lda=LdaModel.load("./lda.model")
② word2vec 模型
model="./pinglun.model"
if os.path.exists(model):
model=gensim.models.Word2Vec.load("./pinglun.model")
else :
model = gensim.models.word2vec.Word2Vec(commentdata, size=200,
workers=7,min_count=2) #训练 word2vec模型
model.save("./pinglun.model")
(1)求θuij
① LDA方法的θ取法
def getHuik(doc_topic,n,bo): #获得Huik
Huikarr = np.zeros((u0, i0, n))
for ui in traindata:
u=int(useridlist[ui[0]])
i=int(itemidlist[ui[1]])
comid=Bui[u][i] #u,i对应的评论的序号
item = doc_topic[int(comid)] #遍历评论的词汇,与主题特征词
for topid in range(5):
Huikarr[u][i][topid]=float(item[topid][1]) #评论ui对应topid的概率
bo[int(comid)][topid]=float(item[topid][1])
return Huikarr
② word2vec的θ取法
def getHuik(doc_topic): #获得Huik
for top in topic:
topid=topictokenlist[top]
temp=topic[topid]
model = gensim.models.Word2Vec.load("./pinglun.model")
simlar=model.most_similar(temp,topn=50) #主题的特征词集,取了10个
for ui in traindata:
u=int(useridlist[ui[0]])
i=int(itemidlist[ui[1]])
comid=Bui[u][i] #u,i对应的评论的序号
for item in commentdata[int(comid)]: #遍历评论的词汇,与主题特征词
tempcom=0 # 统计一条评论中主题特征词的相似和
if item in simlar:
tempcom+=model.similarity(item,temp)
print("zhaodoa!!!")
Huikarr[u][i][topid]=tempcom
return Huikarr
(1)求puij ‘
def getpuj0(u,j): #求单个的puj’
Huij=getHuik() #得θuij数组
tempujs = 0
for item in traindata:
i=int(itemidlist[item[1]]) # 物品号
tempujs+=Huij[u][i][j]
return tempujs/Cu[u] #得到puj ‘
Puj0=np.zeros((len(useridlist),len(topictokenlist)))
def getPuj0(): #求全体puj ’数组
for u in range(len(useridlist)):
for j in range((len(topictokenlist))):
Puj0[u][j]=getpuj0(u,j)
return Puj0
(3)求 puj
def getPuj1():
bottom=np.zeros((len(useridlist)))
for u in range(len(useridlist)):
temp=0
for j in range(len(topictokenlist)):
temp+=Puj0[u][j]
bottom[u]=temp
for u in range(len(useridlist)):
for j in range((len(topictokenlist))):
Puj1[u][j]=Puj0[u][j]/bottom[u]
return Puj1
(2)求qij’
def getqij0(i,j):
Huij=getHuik() #uij数组
tempu = 0
for u in range(len(useridlist)):
tempu+=Huij[u][i][j]
return tempu/Ci[i] #得到p'u
# j
Qij0=np.zeros((len(itemidlist),len(topictokenlist)))
def getQij0():
for i in range(len(itemidlist)):
for j in range(len(topictokenlist)):
Qij0[i][j]=getqij0(i,j)
return Qij0
(4)求qij
def getQij1():
bottom = np.zeros((len(itemidlist)))
for i in range(len(itemidlist)):
temp = 0
for j in range(len(topictokenlist)):
temp += Qij0[i][j]
bottom[i] = temp
for i in range(len((itemidlist))):
for j in range((len(topictokenlist))):
Qij1[i][j] = Qij0[i][j] / bottom[i]
return Qij1
(5)产生用户u未评论物品i的主题分布
def getTuij0(Huij):
Tuij0 = np.zeros((393366, 5))
Qij1=getQij1(Huij)
Puj1=getPuj1(Huij)
Tuij0 = np.zeros((len(useridlist), len(itemidlist),5))
for u in range(len(useridlist)):
for i in range(len(itemidlist)):
mm=int(Bui[u][i])
for j in range(5):
Tuij0[m][j]=Puj1[u][j]*Qij1[i][j]
return Tuij0
def getTuij_input(Huij):
Tuij_input = np.zeros((393366,5))
bottom=np.zeros((393366,1))
Tuij0=getTuij0(Huij)
for u in range(len(useridlist)):
for i in range(len(itemidlist)):
temp=0
hh=int(Bui[u][i])
for j in range(5):
temp+=Tuij0[hh][j]
jj=Bui[u][i]
bottom[jj]=temp
for u in range(len(useridlist)):
for i in range(len(itemidlist)):
for j in range(5):
tok=Bui[u][i]
Tuij_input[tok][j]=Tuij0[tok][j]/bottom[tok]
return Tuij_input
(6)线性回归与预测
bo=np.zeros((393366,5))
m=getHuik(doc_topic,5,bo)
clf= sklearn.linear_model.LinearRegression()
clf.fit(bo,mark)
Test_input=getTuij_input(m)
print("结果:")
for item in testdata:
# item=testdata[1]
print(item)
u=int(useridlist[item[0]])
i=int(itemidlist[item[1]])
print(clf.predict(Test_input[u][i])) #输出预测评分
python实现lfm_Python实现根据评论评分信息预测 (协同过滤,LFM,词向量)相关推荐
- 使用 Python 深度学习方法对电影评论进行情绪预测
情感分析是一种自然语言处理问题,可以理解文本并预测潜在意图. 在本文中,你将了解如何使用 Keras 深度学习库将电影评论的情绪预测为正面或负面. 看完这篇文章,你会知道: 关于自然语言处理的 IMD ...
- 产品经理也能动手实践的AI(五)- IMDB电影评论语义识别,协同过滤
上一节产品经理也能动手实践的AI(四)- 多标签识别,图像分割讲了多标签识别,图像分割和data block,这之前讲的都是图像识别的方法,今天一节课把剩下的3种核心领域都讲了:自然语言处理,表格数据 ...
- python二手车之家汽车数据分析与推荐flask_协同过滤_爬虫
开发工具(eclipse/idea/vscode等):pychram 数据库(sqlite/mysql/sqlserver等):sqlite 功能模块(请用文字描述,至少200字): 1 用户登录功能 ...
- 【自然语言处理】Word2Vec 词向量模型详解 + Python代码实战
文章目录 一.词向量引入 二.词向量模型 三.训练数据构建 四.不同模型对比 4.1 CBOW 4.2 Skip-gram 模型 4.3 CBOW 和 Skip-gram 对比 五.词向量训练过程 5 ...
- 【word2vec】python读取pdf文件,通过词向量寻找相关词语
1. 什么是Word2vec 对于自然语音处理而言,首先要做的就是将文字转换为计算机能看懂的数字,也就是说,将词语进行数字化. (1)one-hot编码,比较常用的一种编码方式,又叫独热编码. 对于一 ...
- python协同过滤_协同过滤的python简易实现
原标题:协同过滤的python简易实现 了解推荐算法的人对协同过滤都不陌生,协同过滤就寻找和被推荐客户品味相似的客户,找出利用这些相似客户的偏好特征为用户推荐产品.下面就通过一个简单的示例将协同过滤加 ...
- 用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)
爬虫入门:python爬取豆瓣影评及影片信息:影片评分.评论时间.用户ID.评论内容 思路分析 元素定位 完整代码 豆瓣网作为比较官方的电影评价网站,有很多对新上映影片的评价,不多说,直接进入正题. ...
- python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...
def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...
- python产品质量分析_产品评论 使用Python分析Amazon Smart产品评论
在万物互联时代,智能产品正在推动智能生活的迅速普及.专注于广阔的智能产品市场,亚马逊一直致力于扩大其智能产品阵容.作为典型的跨境电子商务B2C平台 一.明确目标 建模和分析Amazon智能产品评论,探 ...
最新文章
- log库spdlog简介及使用
- what's the 回撤
- python基础代码事例-推公式到写代码-python基础
- 39.原码、反码、补码的转换
- MapXtreme 安装、编码及打包注意事项
- Windows下压缩包安装Mysql
- 【Java用法】java 8两个List集合取交集、并集、差集、去重并集
- NeurIPS2021 HRFormer:HRNet又出续作啦!国科大北大MSRA提出高分辨率Transformer,开源!...
- 【架构师培训课程-技术基础课】
- 北京发布人工智能产业政策,该如何高效关注行业动态、把握新机遇?
- C#中未将对象引用设置到对象的实例
- 常见笔顺错误的字_有哪些常见笔顺错误?
- Oracle RAC命令
- 002 splitter
- 初学博科YIGO2.0学习心得--下推
- 10.5日饿了么复活了,大家凑合用用吧~(偶尔更新~)
- 第二十二章 SQL命令 CREATE TRIGGER(二)
- 【java】计算员工工资
- 阿里巴巴最新总结「百亿级别并发设计手册」GitHub收获70K标星
- 使用NeRF进行3D体素渲染
热门文章
- 柳青:再见!滴滴打车 其实这里面都是故事
- 【前端】在线咨询:移动端调用QQ代码
- 关于AJAX的ScriptManager.RegisterClientScriptBlock无法弹出对话框的解决方法【归类】
- js实现淘宝首页图片轮播效果
- php eval一句话木马干啥的,eval函数简介与PHP一句话木马剖析
- Windows Vista 安装全程图解
- 你刚吃的兰州牛肉面,背后就藏着大数据
- 一份很棒的外设驱动库!(基于STM32F4)
- ESP32 + Python守护家庭健康、自己动手做个甲醛浓度检测设备
- 文体用品与科技杂志文体用品与科技杂志社文体用品与科技编辑部2023年第5期目录