哇塞,大学本科四年的时光就这样结束了,虽然做毕设的整个过程并不是特别煎熬,也没有像别人一样熬夜写代码,但是通过毕设我确实了解很多计算机相关知识,现在进行一个简单的总结:
最近更新这个系统,具体页面展示在这一片博客:
整个推荐模型的设计和实现的大体结构如下:
通过从数据库或csv文件中获取数据源,首先把数据进行数据清洗、数据集成、数据规约和模型鉴定,紧接着将数据与对应模式库的规则进行模式匹配,从而选择合适的算法进行模型训练和学习,并进行算法评估和对新出现的数据进行存储和学习,在上述过程中对所有操作进行日志管理和检验是否具备可操作权限,最后输出用户所期望的数据信息和内容。该模型能应用在景点分类、经费计算、路径规划、酒店推荐、特征提取、美食推荐。
目录
学会了python的基本使用,包含其中的numpy、pandas、jieba、sqlite、re等各式各样的库
开始接触算法的应用和创新,在毕设设计到了TF-IDF算法、朴素贝叶斯分类、蚁群算法
学会了网络爬虫,本次毕设使用的是beautifulsoup4v
现在目录上的章节如果有时间会进行详细的文章编写,目前暂时只完成了网络爬虫部分。
了解基于django的web开发
由于本次在研究中需要对模型的应用进行一个更好的可视化展示效果,我做了两个简单的开发界面,第一个是旅游界面的推荐,第二个是推荐后得到的结果。其具体Django教程在:快速入门Django开发教程(旅游推荐系统实现教程)
- 在做界面的时候主要是体验了一下循环渲染吧。{% %}
- 使用了json做了一下前后端数据的传输
- 使用ajax做了异步传输
- 还有如何快速获取网页的代码,当然这个只适用于日常的学习和研究。
- 模型的实现和应用
学会了python的基本使用,包含其中的numpy、pandas、jieba、sqlite、re等各式各样的库
自从使用了python以后,才发现python是真的很好用哈,基本可以使用python进行编程了。
- 了解到python中的字典、元组的使用并不局限于一维的方法,并能结合字典和元组一起使用。
- 在django开发中理解了class的使用和函数的定义和引用
- jieba用来处理的分词效果是真的很好哦
- numpy用来数据和矩阵的处理,真的很方便,基本上和pandans、matplotlib一起使用了
- 接触了一种新的数据库sqlite,了解了基本的增删改查。
- 接触到正则表达式,主要用了信息提取和信息删除
- 还有如何创建csv文件、遍历文件
- 接触到一种新的库管理工具homebrew
开始接触算法的应用和创新,在毕设设计到了TF-IDF算法、朴素贝叶斯分类、蚁群算法
- 使用TF-IDF是进行的关键词提取

- 使用朴素贝叶斯来进行景点分类
现代风情、历史风情、当地特色、博物馆、动物园、游乐中心、历史伟人、当地公园、植物园、国内名校、购物中心、当地剧院、当地古镇、红色文化、体育公园、宗教圣地
在180个热门景点中有博物馆8个、当地动物园8个、当地公园17个、当地古镇4个、当地剧院3个、当地特色48个、购物中心8个、国内名校4个、红色文化6个、历史风情28个、历史伟人8个、体育公园3个、游乐中心17个、植物园3个、宗教圣地6个、现代风情10个。
- 使用蚁群算法用来进行景点的路径规划

这些算法还是真的神奇,佩服数学的神奇!
学会了网络爬虫,本次毕设使用的是beautifulsoup4
第一次爬虫额,成功的爬取到了携程网的酒店、景点、美食信息。
其中本次爬虫的主要思想是:首先是找到携程网url的编写规律,然后根据规律使用beautifulsoup4对所需的html语言中的信息提取,最后就是封装处理。
如下是我爬取美食的代码,貌似景点和酒店已经我写的代码已经爬不了了。其具体代码在使用python爬取携程网旅游信息(包含景点、酒店、美食)
# -*- coding: utf-8 -*-
import requests
import io
from bs4 import BeautifulSoup as BS
import time
import re
"""从网上爬取数据"""
headers = {
"Origin": "https://piao.ctrip.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
}
places=["beijing1","shanghai2","changsha148","sanya61","chongqing158","hongkong38","chengdu104","haerbin151",
"xian7","guangzhou152","hangzhou14"]
placenames=["北京","上海","长沙","三亚","重庆","香港","成都","哈尔滨","西安","广州","杭州"]
places=["changsha148"]
placenames=["长沙"]
base="https://you.ctrip.com/fooditem/";
base2="https://you.ctrip.com";
requestlist=[]
for j in range(len(places)): #爬取对应的特色菜
requestlist.append({"url":base+places[j]+".html","place":placenames[j]})
for i in range(2,2):
tmp=base+places[j]+"/s0-p"+str(i)+".html"
requestlist.append({"url":tmp,"place":placenames[j]});
#对应的url地址和所查询的位置
print(requestlist)
l=[]
count=1;
for i in range(len(requestlist)):
response = requests.get(requestlist[i]["url"], headers=headers)
#print(response)
html=response.text
#print(html)
soup=BS(html,'html.parser')
vs=soup.find_all(name="div",attrs={"class":"rdetailbox"})
print("len(vs)",len(vs))
for j in range(len(vs)):
print("正在打印的条数:",j)
try:
#获取子网页链接地址
href=vs[j].find(name="a",attrs={"target":"_blank"}).attrs["href"];
#print("href",href)
# 再次请求子网页,获取景点详细信息
res = requests.get(base2+href, headers=headers)
print("当前访问的网址:",base2+href)
with open("3.html","w",encoding="utf-8") as f:
f.write(res.text)
soupi = BS(res.text,"html.parser") #该网页的html代码
#print(soupi)
vis = soupi.find_all(name="li",attrs={"class":"infotext"}); #获取此时的dom文件位置所在
#print(vis)
introduce=[]
for i in range(len(vis)):
introduce.append(vis[i].get_text())
imgs=[];
imglinks=soupi.find_all(name="a",attrs={"href":"javascript:void(0)"})
#print(imte)
# print(imglinks)
# print(type(imglinks))
#for img in imte:
#imgs.append(img.attrs["src"])
tmp={};
tmp["id"]=count;
tmp["name"]=vs[j].find(name="a",attrs={"target":"_blank"}).string;
tmp["name"]=tmp["name"].replace(" ","").replace("\n","");
tmp["introduce"]=introduce
tmp["img"]=imglinks
tmp["city"]=requestlist[i]["place"]
count=count+1;
l.append(tmp);
time.sleep(1);
except Exception as e:
print(e)
pass
#print ("打印tmp",tmp)
# with open("datap/"+tmp["name"]+".pk",'wb') as f:
# pickle.dump(tmp,f);
with io.open("/Users/hujinhong/PycharmProjects/untitled5/food/changsha/"+tmp["name"]+".txt",'w',encoding="utf-8") as f:
f.write(str(tmp))
#print(l)
for i in l:
print((i))
# # browser.close()#关闭浏览器
# with open("data2.txt",'w',encoding='utf-8') as f:
# f.write(str(l))
# with open("data2.pk","w",encoding="utf-8") as f:
# pickle.dump(l,f);
#https://hotels.ctrip.com/hotel/qingdao7/star2/k1%E4%BA%94%E5%9B%9B%E5%B9%BF%E5%9C%BA#ctm_ref=ctr_hp_sb_lst
所以爬虫还是挺有意思的。
接触了数据挖掘、基于内容的推荐
这两个话题虽然比较大,但是我还是想简单说一下自己的理解
- 数据挖掘的主要是最有用信息的一个提取,而我此次做的我觉得跟和机器学习相关联,因为是一个自动学习的过程。
- 然后基于内容的推荐,跟需要的自身含有的数据量,数据越多可能得到的结果会跟好,但是过多过少都会影响结果的正确性,过少的话会导致信息的特征少,过多的话会导致特征太过于负责,并且基于内容的推荐是不能挖掘用户的潜在信息的。