一.数据集

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,词向量)相关推荐

  1. 使用 Python 深度学习方法对电影评论进行情绪预测

    情感分析是一种自然语言处理问题,可以理解文本并预测潜在意图. 在本文中,你将了解如何使用 Keras 深度学习库将电影评论的情绪预测为正面或负面. 看完这篇文章,你会知道: 关于自然语言处理的 IMD ...

  2. 产品经理也能动手实践的AI(五)- IMDB电影评论语义识别,协同过滤

    上一节产品经理也能动手实践的AI(四)- 多标签识别,图像分割讲了多标签识别,图像分割和data block,这之前讲的都是图像识别的方法,今天一节课把剩下的3种核心领域都讲了:自然语言处理,表格数据 ...

  3. python二手车之家汽车数据分析与推荐flask_协同过滤_爬虫

    开发工具(eclipse/idea/vscode等):pychram 数据库(sqlite/mysql/sqlserver等):sqlite 功能模块(请用文字描述,至少200字): 1 用户登录功能 ...

  4. 【自然语言处理】Word2Vec 词向量模型详解 + Python代码实战

    文章目录 一.词向量引入 二.词向量模型 三.训练数据构建 四.不同模型对比 4.1 CBOW 4.2 Skip-gram 模型 4.3 CBOW 和 Skip-gram 对比 五.词向量训练过程 5 ...

  5. 【word2vec】python读取pdf文件,通过词向量寻找相关词语

    1. 什么是Word2vec 对于自然语音处理而言,首先要做的就是将文字转换为计算机能看懂的数字,也就是说,将词语进行数字化. (1)one-hot编码,比较常用的一种编码方式,又叫独热编码. 对于一 ...

  6. python协同过滤_协同过滤的python简易实现

    原标题:协同过滤的python简易实现 了解推荐算法的人对协同过滤都不陌生,协同过滤就寻找和被推荐客户品味相似的客户,找出利用这些相似客户的偏好特征为用户推荐产品.下面就通过一个简单的示例将协同过滤加 ...

  7. 用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)

    爬虫入门:python爬取豆瓣影评及影片信息:影片评分.评论时间.用户ID.评论内容 思路分析 元素定位 完整代码 豆瓣网作为比较官方的电影评价网站,有很多对新上映影片的评价,不多说,直接进入正题. ...

  8. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  9. python产品质量分析_产品评论 使用Python分析Amazon Smart产品评论

    在万物互联时代,智能产品正在推动智能生活的迅速普及.专注于广阔的智能产品市场,亚马逊一直致力于扩大其智能产品阵容.作为典型的跨境电子商务B2C平台 一.明确目标 建模和分析Amazon智能产品评论,探 ...

最新文章

  1. log库spdlog简介及使用
  2. what's the 回撤
  3. python基础代码事例-推公式到写代码-python基础
  4. 39.原码、反码、补码的转换
  5. MapXtreme 安装、编码及打包注意事项
  6. Windows下压缩包安装Mysql
  7. 【Java用法】java 8两个List集合取交集、并集、差集、去重并集
  8. NeurIPS2021 HRFormer:HRNet又出续作啦!国科大北大MSRA提出高分辨率Transformer,开源!...
  9. 【架构师培训课程-技术基础课】
  10. 北京发布人工智能产业政策,该如何高效关注行业动态、把握新机遇?
  11. C#中未将对象引用设置到对象的实例
  12. 常见笔顺错误的字_有哪些常见笔顺错误?
  13. Oracle RAC命令
  14. 002 splitter
  15. 初学博科YIGO2.0学习心得--下推
  16. 10.5日饿了么复活了,大家凑合用用吧~(偶尔更新~)
  17. 第二十二章 SQL命令 CREATE TRIGGER(二)
  18. 【java】计算员工工资
  19. 阿里巴巴最新总结「百亿级别并发设计手册」GitHub收获70K标星
  20. 使用NeRF进行3D体素渲染

热门文章

  1. 柳青:再见!滴滴打车 其实这里面都是故事
  2. 【前端】在线咨询:移动端调用QQ代码
  3. 关于AJAX的ScriptManager.RegisterClientScriptBlock无法弹出对话框的解决方法【归类】
  4. js实现淘宝首页图片轮播效果
  5. php eval一句话木马干啥的,eval函数简介与PHP一句话木马剖析
  6. Windows Vista 安装全程图解
  7. 你刚吃的兰州牛肉面,背后就藏着大数据
  8. 一份很棒的外设驱动库!(基于STM32F4)
  9. ESP32 + Python守护家庭健康、自己动手做个甲醛浓度检测设备
  10. 文体用品与科技杂志文体用品与科技杂志社文体用品与科技编辑部2023年第5期目录