练习题︱豆瓣图书的推荐与搜索、简易版知识引擎构建(neo4j)
DouBanRecommend
基于豆瓣圖書的推薦、知識(shí)圖譜與知識(shí)引擎簡(jiǎn)單構(gòu)建neo4j
本項(xiàng)目主要貢獻(xiàn)源來(lái)自豆瓣爬蟲(數(shù)據(jù)源)lanbing510/DouBanSpider、知識(shí)圖譜引擎Agriculture_KnowledgeGraph、apple.turicreate中內(nèi)嵌的推薦算法。
主要拿來(lái)做練習(xí),數(shù)據(jù)來(lái)源可見lanbing510/DouBanSpider。
練習(xí)內(nèi)容:
- 豆瓣圖書推薦 + 搜索模塊
- 豆瓣圖書知識(shí)庫(kù)簡(jiǎn)單應(yīng)用(Neo4j的使用)
筆者的github:https://github.com/mattzheng/DouBanRecommend
歡迎給星噢~
推薦與搜索模塊再結(jié)合豆瓣內(nèi)部的API就更加牛逼~~~!(豆瓣API)
一、數(shù)據(jù)整理
簡(jiǎn)單的把爬蟲數(shù)據(jù)進(jìn)行簡(jiǎn)單的整理。主要做了一下針對(duì)每本書的評(píng)分,數(shù)據(jù)源中有兩個(gè)值得用的字段:豆瓣書籍評(píng)分 + 書籍閱讀人數(shù),先等級(jí)化,然后進(jìn)行平均,簡(jiǎn)單的得到了該書籍的得分。
# 把豆瓣讀書評(píng)分 / 豆瓣讀書人群數(shù)量 進(jìn)行分箱 book_excel_all['rank_rank'] = pd.qcut(book_excel_all['rank'],10,duplicates ='drop',labels = False) book_excel_all['people_num_rank'] = pd.qcut(book_excel_all['people_num'],10,duplicates ='drop',labels = False) # 分箱之后,進(jìn)行平均 book_excel_all['scores'] = (book_excel_all['rank_rank'] + book_excel_all['people_num_rank'])/2得到了如圖的內(nèi)容:
那么就開始做練習(xí)題啦~
二、豆瓣圖書推薦 + 搜索模塊
推薦 + 搜索模塊主要使用的是apple.turicreate模塊的算法,那么該模塊的使用可見:
推薦模塊︱apple.Turicreate個(gè)性化推薦recommender(五)
簡(jiǎn)單貼個(gè)當(dāng)時(shí)整理的圖。
| 基于item相似推薦 | item_similarity_recommender | 有預(yù)測(cè)功能,item之間喜愛(ài)的相似程度。適用在給未知人群推薦的時(shí)候,可以尋找到item的相似對(duì) | |
| 因式分解 | ranking_factorization_recommender以及factorization_recommender | 最常用,支持附加信息共同進(jìn)模型 | |
| 基于內(nèi)容的相似推薦 | item_content_recommender | 沒(méi)有user概念,Item自己內(nèi)容(多維度)決定,同類推薦,且沒(méi)有點(diǎn)評(píng)數(shù)據(jù)可以提取的時(shí)候可以應(yīng)用 | 數(shù)據(jù)格式不滿足 |
| 項(xiàng)目流行度推薦 | item popularity | 基于項(xiàng)目流行程度來(lái)推薦,user不進(jìn)入模型,缺點(diǎn):并不能因人而異,受異常值影響較大 |
主要內(nèi)容見文件夾book_recomend.
本練習(xí)主要使用的算法是:基于item相似推薦
2.1 搜索模塊:
輸入:總表book_excel_all(book_excel.csv)
輸出:搜索到的文檔
算法:沒(méi)有建模,主要是:先完全匹配;匹配不到,局部匹配,包含
簡(jiǎn)單展示一下最終結(jié)果:
search_word = '機(jī)器學(xué)習(xí)' search(search_word,book_excel_all)得到的結(jié)果可見:
2.2 推薦模塊:
輸入:總表book_excel_all(book_excel.csv)、基于類目item的推薦表(book_excel_name.csv)、搜索詞(該搜索詞一定時(shí)全的)
輸出:相似圖書推薦
目前使用的算法:apple.turicreate中的item_similarity_recommender推薦算法
簡(jiǎn)單展示一下所寫的功能:
search_word = '浪潮之巔' item_recomend(search_word,book_excel_all,recomend_item,topn = 10)結(jié)果:
2.3 推薦對(duì)應(yīng)表生成模塊
根據(jù)核心數(shù)據(jù)源,利用apple.turicreate平臺(tái)的基于item的推薦,主要是以書籍類別為主要篩選對(duì)象,對(duì)書籍類別進(jìn)行相關(guān)推薦,輸入信息表,輸出相關(guān)推薦表格。如表格:item_data_item.csv
三、豆瓣圖書知識(shí)庫(kù)簡(jiǎn)單應(yīng)用(Neo4j的使用)
借用neo4j簡(jiǎn)單的實(shí)踐了一下:neo4j的docker啟動(dòng)、數(shù)據(jù)導(dǎo)入模塊、py2neo查詢模塊。
練習(xí)的時(shí)候有些心得:
保證節(jié)點(diǎn)的唯一性
犯錯(cuò):在book_excel,書名信息是不唯一的,可能一本書既可能被歸類到 旅游、哲學(xué)、編程、創(chuàng)業(yè)
其他心得:
(1)從效果來(lái)看,如果關(guān)系類型比較少,比較適合直接用多表合一的方式進(jìn)行查詢;
知識(shí)圖譜中的圖數(shù)據(jù)庫(kù)的查詢,建立在關(guān)系錯(cuò)綜復(fù)雜、才有查詢必要。
(2)圖數(shù)據(jù)庫(kù),一定要對(duì)節(jié)點(diǎn) + 關(guān)系去重
時(shí)間消耗:
3W節(jié)點(diǎn) - 25.7W關(guān)系 - 3h時(shí)間 - 1002MB
3.1 neo4j的docker啟動(dòng)
neo4j開啟的一種方法就是docker啟動(dòng),neo4j的docker下載地址:/neo4j/”>https://hub.docker.com//neo4j/
筆者在使用neo4j的使用會(huì)遇到幾個(gè)問(wèn)題:
- neo4j的內(nèi)存默認(rèn)設(shè)置太小,需要手動(dòng)擴(kuò)大
- 數(shù)據(jù)導(dǎo)入模塊
- 已經(jīng)導(dǎo)入的數(shù)據(jù)怎么保存
因?yàn)楸镜財(cái)?shù)據(jù)導(dǎo)入neo4j之中,最好把數(shù)據(jù)放在指定目錄之中,于是乎在docker啟動(dòng)之前就可以設(shè)置一下:
docker run \--publish=7474:7474 --publish=7687:7687 \--volume=/matt/neo4j:/var/lib/neo4j/import --rm -ti neo4j bash其中/matt/neo4j是宿主機(jī)的目錄,/var/lib/neo4j/import是docker之中本地導(dǎo)入csv的路徑,那么這樣就可以直接使用:LOAD CSV WITH HEADERS FROM "file:///book_excel_name.csv" AS line
擴(kuò)大內(nèi)存的話,就需要到/neo4j/conf/neo4j.conf之中修改以下參數(shù):
dbms.memory.heap.initial_size = 1024G dbms.memory.heap.max_size= 1024G dbms.memory.pagecache.size = 10240M # 緩存,可以調(diào)制到一些在docker 之中開啟neo4j為:
/var/lib/neo4j/bin/neo4j start打開之后需要等待一段時(shí)間的啟動(dòng)。
已經(jīng)導(dǎo)入的數(shù)據(jù)怎么保存?
備份Neo4j的數(shù)據(jù):
1)停掉數(shù)據(jù)庫(kù).2)備份D:\Neo4J\neo4j-enterprise-1.9.1\data目錄下graph.db目錄中的所有內(nèi)容.3)在服務(wù)器上拷貝graph.db目錄中的內(nèi)容到新的服務(wù)器的相同目錄中,啟動(dòng)即可.3.2 數(shù)據(jù)導(dǎo)入模塊
為了確保唯一性,所以導(dǎo)入的時(shí)候,書名節(jié)點(diǎn)、書類別節(jié)點(diǎn)、出版社節(jié)點(diǎn)都是唯一的,同時(shí)建立了書籍-類型的關(guān)系。
// 導(dǎo)入書名節(jié)點(diǎn) LOAD CSV WITH HEADERS FROM "file:///book_excel_name.csv" AS line CREATE (:BookNode { name:line.book_name,rank:line.rank,people_num:line.people_num, author:line.author,public_infos:line.public_infos,public_time:line.public_time,price:line.price })// 導(dǎo)入書類別節(jié)點(diǎn) LOAD CSV WITH HEADERS FROM "file:///book_excel_type.csv" AS line CREATE (:BookType { type:line.type }) // MATCH (n:BookType) OPTIONAL MATCH (n)-[r]-() DELETE n,r // 刪除命令// 導(dǎo)入書出版社節(jié)點(diǎn) LOAD CSV WITH HEADERS FROM "file:///book_excel_public.csv" AS line CREATE (:BookPub { pub:line.public }) // MATCH (n:BookPub) OPTIONAL MATCH (n)-[r]-() DELETE n,r //刪除命令//建立關(guān)系:書-類型 LOAD CSV WITH HEADERS FROM "file:///book_excel.csv" AS line MATCH (entity1:BookNode{name:line.book_name}), (entity2:BookType{type:line.type}) CREATE (entity1)-[:RELATION_TYPE]->(entity2);這邊導(dǎo)入的時(shí)候發(fā)現(xiàn)有些重復(fù)關(guān)系,懶… 就不改了…
3.3 py2neo查詢模塊
主要數(shù)據(jù)可見:douban_kg文檔
from py2neo import Node, Relationship, Graph graph = Graph("http://localhost:7474", username="neo4j", password="qwer@1234" )通過(guò)py2neo先鏈接neo4j數(shù)據(jù)庫(kù)。同時(shí):
# 查詢書目?jī)?nèi)容 graph.find_one(label="BookNode",property_key="name",property_value='計(jì)算機(jī)視覺(jué)')# label代表:標(biāo)簽# property_key代表:節(jié)點(diǎn)屬性# property_value代表:具體屬性名稱# 查詢書目-類型 graph.data("MATCH (entity1) - [:RELATION_TYPE] -> (entity2) WHERE entity2.ytpe = '旅行' RETURN rel,entity2")總結(jié)
以上是生活随笔為你收集整理的练习题︱豆瓣图书的推荐与搜索、简易版知识引擎构建(neo4j)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx 解决 405 not all
- 下一篇: 07.数据表的修改