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