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