Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_48368015
NewsRecommendSystem
提交
4cc51d48
N
NewsRecommendSystem
项目概览
weixin_48368015
/
NewsRecommendSystem
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
NewsRecommendSystem
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
4cc51d48
编写于
4月 08, 2019
作者:
X
Xinyao Qian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
readme
上级
cd84e8a4
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
5 addition
and
1473 deletion
+5
-1473
README.html
README.html
+0
-1472
README.md
README.md
+3
-1
docs/English/README.md
docs/English/README.md
+2
-0
未找到文件。
README.html
已删除
100644 → 0
浏览文件 @
cd84e8a4
<!DOCTYPE html>
<html><head><meta
charset=
"utf-8"
><meta
name=
"viewport"
content=
"width=device-width, initial-scale=1"
><style>body
{
max-width
:
980px
;
border
:
1px
solid
#ddd
;
outline
:
1300px
solid
#fff
;
margin
:
16px
auto
;
}
body
.markdown-body
{
padding
:
45px
;
}
@font-face
{
font-family
:
fontawesome-mini
;
src
:
url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAABE0AA8AAAAAHWwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY3d1HZY21hcAAAAdgAAACqAAACOvWLi0FjdnQgAAAChAAAABMAAAAgBtX/BGZwZ20AAAKYAAAFkAAAC3CKkZBZZ2FzcAAACCgAAAAIAAAACAAAABBnbHlmAAAIMAAABdQAAAjkYT9TNWhlYWQAAA4EAAAAMwAAADYQ6WvNaGhlYQAADjgAAAAfAAAAJAc6A1pobXR4AAAOWAAAACAAAAA0Kmz/7mxvY2EAAA54AAAAHAAAABwQPBJubWF4cAAADpQAAAAgAAAAIAEHC/NuYW1lAAAOtAAAAYQAAALxhQT4h3Bvc3QAABA4AAAAfgAAAMS3SYh9cHJlcAAAELgAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZHZmnMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4Pwz+yMwf9z2KIYg5imAYUZgTJAQDcoQvQAHic7ZHNDYJAFIRnBXf94cDRIiyCKkCpwFCPJ092RcKNDoYKcN4+EmMPvpdvk539zQyAPYBCXEUJhBcCrJ5SQ9YLnLJe4qF5rdb+uWPDngNHTkta101pNyWa8lMhn6xx2dqUnW4q9YOIhAOOeueMSgsR/6ry+P7O5s6xVNg4chBsHUuFnWNJ8uZYwrw7chrsHXkODo7cB0dHOYCTY8kv0VE2WJKD6gOlWjsxAAB4nGNgQAMSEMgc9D8LhAESbAPdAHicrVZpd9NGFB15SZyELCULLWphxMRpsEYmbMGACUGyYyBdnK2VoIsUO+m+8Ynf4F/zZNpz6Dd+Wu8bLySQtOdwmpOjd+fN1czbZRJaktgL65GUmy/F1NYmjew8CemGTctRfCg7eyFlisnfBVEQrZbatx2HREQiULWusEQQ+x5ZmmR86FFGy7akV03KLT3pLlvjQb1V334aOsqxO6GkZjN0aD2yJVUYVaJIpj1S0qZlqPorSSu8v8LMV81QwohOImm8GcbQSN4bZ7TKaDW24yiKbLLcKFIkmuFBFHmU1RLn5IoJDMoHzZDyyqcR5cP8iKzYo5xWsEu20/y+L3mndzk/sV9vUbbkQB/Ijuzg7HQlX4RbW2HctJPtKFQRdtd3QmzZ7FT/Zo/ymkYDtysyvdCMYKl8hRArP6HM/iFZLZxP+ZJHo1qykRNB62VO7Es+gdbjiClxzRhZ0N3RCRHU/ZIzDPaYPh788d4plgsTAngcy3pHJZwIEylhczRJ2jByYCVliyqp9a6YOOV1WsRbwn7t2tGXzmjjUHdiPFsPHVs5UcnxaFKnmUyd2knNoykNopR0JnjMrwMoP6JJXm1jNYmVR9M4ZsaERCICLdxLU0EsO7GkKQTNoxm9uRumuXYtWqTJA/Xco/f05la4udNT2g70s0Z/VqdiOtgL0+lp5C/xadrlIkXp+ukZfkziQdYCMpEtNsOUgwdv/Q7Sy9eWHIXXBtju7fMrqH3WRPCkAfsb0B5P1SkJTIWYVYhWQGKta1mWydWsFqnI1HdDmla+rNMEinIcF8e+jHH9XzMzlpgSvt+J07MjLj1z7UsI0xx8m3U9mtepxXIBcWZ5TqdZlu/rNMfyA53mWZ7X6QhLW6ejLD/UaYHlRzodY3lBC5p038GQizDkAg6QMISlA0NYXoIhLBUMYbkIQ1gWYQjLJRjC8mMYwnIZhrC8rGXV1FNJ49qZWAZsQmBijh65zEXlaiq5VEK7aFRqQ54SbpVUFM+qf2WgXjzyhjmwFkiXyJpfMc6Vj0bl+NYVLW8aO1fAsepvH472OfFS1ouFPwX/1dZUJb1izcOTq/Abhp5sJ6o2qXh0TZfPVT26/l9UVFgL9BtIhVgoyrJscGcihI86nYZqoJVDzGzMPLTrdcuan8P9NzFCFlD9+DcUGgvcg05ZSVnt4KzV19uy3DuDcjgTLEkxN/P6VvgiI7PSfpFZyp6PfB5wBYxKZdhqA60VvNknMQ+Z3iTPBHFbUTZI2tjOBIkNHPOAefOdBCZh6qoN5E7hhg34BWFuwXknXKJ6oyyH7kXs8yik/Fun4kT2qGiMwLPZG2Gv70LKb3EMJDT5pX4MVBWhqRg1FdA0Um6oBl/G2bptQsYO9CMqdsOyrOLDxxb3lZJtGYR8pIjVo6Of1l6iTqrcfmYUl++dvgXBIDUxf3vfdHGQyrtayTJHbQNTtxqVU9eaQ+NVh+rmUfW94+wTOWuabronHnpf06rbwcVcLLD2bQ7SUiYX1PVhhQ2iy8WlUOplNEnvuAcYFhjQ71CKjf+r+th8nitVhdFxJN9O1LfR52AM/A/Yf0f1A9D3Y+hyDS7P95oTn2704WyZrqIX66foNzBrrblZugbc0HQD4iFHrY64yg18pwZxeqS5HOkh4GPdFeIBwCaAxeAT3bWM5lMAo/mMOT7A58xh0GQOgy3mMNhmzhrADnMY7DKHwR5zGHzBnHWAL5nDIGQOg4g5DJ4wJwB4yhwGXzGHwdfMYfANc+4DfMscBjFzGCTMYbCv6dYwzC1e0F2gtkFVoANTT1jcw+JQU2XI/o4Xhv29Qcz+wSCm/qjp9pD6Ey8M9WeDmPqLQUz9VdOdIfU3Xhjq7wYx9Q+DmPpMvxjLZQa/jHyXCgeUXWw+5++J9w/bxUC5AAEAAf//AA94nIVVX2hbZRQ/5/t7893s5ja9f7ouzdZ0TTqz3bRJmogbWya6bG6Cq0VbSV2ddIJjFtfIQHEig80Hda8yUN/0YQz8AyriiyD+xQd92R4HCnaCb3samnpumrpsCsLlfPf7zvedc37nL3CAtc/5W/wQZGA3tOBSY/g+TMjHmwzEoM1Q8+ZjRZY4oJhmBw5/YB6Za0yC5AkhlwA1A1yCBIBOwCII0Cj0U8BAMdUCzq05sKwkP7SlUY6fcJk4Fb/RyE79/6P5hjM/F4aZiXBoeMgzcqQ4Xi1hPqfDLG5FT+lchCVU3lYMyvuwhl1mqndQL0RsuloLywHtthLXI06OblTrhfWVnpSJ5+mwu/JdbtuN3IAnkW0LLMcRwaC7ktrlzridM6kVdyf9uO1UNBByI7JhwtG2sEwab07ORBeilWhqavJCqV0qzZTOl/7ZXQ5TbTcdcFelyGhhRDAQpdqp1FEX3w3cFTc1k9pJQkmm4ySCbSikxRP2QOfN+0tHS5MrpQuTU1Mk5nw0E5Xa0WvrOwDyGax9yB9ma6DAg82wHc43SAGTI4GjBWebOePAERFE8/AHaQpZASSTy8A4WwZiLQMQ82mFKATO0ILicRAoDm9p5P99E5b/fXG+kQYY3TYUuqmERWYoT0u/GNYL2q/4WB3LaVS+VynXsVYIcWw6DkCh3nX1D+VzlYN4LClF5yexSQos8exqZ3KVP+wtrC54u4Nznq6cq+xpMpUUnZ8FUYzE86ud0g28NOIv3Gj5/rmA3ABs7S/ywzFuQ4qyd6QxfNtiQIaEgp3w/entQg4Vcbqa16M5FfpeUB8t1+qeg7mI7cUyOe79wOk86gSxkVec4KPTX69++5x68Yubn5/F+w52z7u08sJX7fZXv8ekT/d2mILJxq6sn+SC6qEJknzLJCxyZEKwWVqYmAPBxBE/9DLeZiWHu7lcr/VytrCRuHojncNuTt9h46tmacmYisnSamdN2bZptcsmSysdVsy1PrOvOzF3xN64Rb937t/og9KHxYdcjIUqFAmIAHGHNzlns+RTPgeUYAQm9DwpNxfxbhhBHPaw3/gfTcXO2L+eJVIx5nsyGkvm9X4/f+bGkH45G0PaSjcMXTjcZyTvi3UdHoCDjQd3IDUVsgwYmUoJK/gp4JJxeRI0MKHZIkgynyIBqBTOUs6rOVCojvjZ4mCQz49ZMlMcp8QoYk6NoBfsxnJtsBohpa8iGJS+ZH7gU7NxME6cmF+t7cO9vB8d3jTWSct0ycW9ranXmolNDwmVkNnxe+8JtoztwS5rKJ0xWS95tQ/1zMYzg69MzUZnNtl1ofNbsml/OJm6f9wjRjpnu2o4MzHzn77IQkRd+1DjwMQ2pqSjGMMhyjrgTbBAKksuUm0iU7hI0aN2wOKOq7WYBSH0HGihj/jkiPxAfmwsEbfYrjMG+j3ij932Db/LV7I/xruNrhnroxjR9HRMb2nTvO0ZXOoHPk8H2ZhDPx93qcE/53sH5np/dkIP7zzhTVKdR/BAY/9ElkkR+A6lJGsqpJ4oQcTxpvBT3Kn58VkaJjgHyPEIws57xkaHh9KuVpDEpJZeMbZ5w/zBHi5NMQ4r5VphsFqID7TyB9eR4pX216c3AHxpdAwoqU9qg0ZJ6yVLKmMSz1iG2z27ifx18NkY0LPx1W/wCc2l5LrznrIsiKsqbmB78A9wIGx4tI8rjihVHJyY9pgMirenVq0yWg7Iw7eogG7ZgYM3qR9959A/fZkg6MnD/exlkmc+jWV4SB15XUR+eqC6l6ZmgPtN9z5JMfik05OV8ljylunJ4J+wA/FUaQSSKotsYsCWqaPBidBLcxkWx7XKFRIb45TGaEhjlF9uUVPqXOtcIwsXbBvfoZXIyRYFdkfnqjExH98xpnPczqzjX/uNdO1Y17Wpi5+6Ts8BXtjVFasp9KZ1mOiNbH65c5w6HgmyF2jFCZywM8mWjRc7T5Pmt0lRy7Y71+jYbpGyvwG4sH0XeJxjYGRgYADiwBB/53h+m68M3MwvgCIM1z5N/g6j///9v5H5BbMnkMvBwAQSBQCIcA9gAHicY2BkYGAO+p8FJF/8//v/F/MLBqAICuAFALYQB5kAeJxjfsHAwLwAiCNB+P9fbJjJmoGBMRUo/wKCAfO2EnQAAAAAANoBXgGcAgICVALaA1IDvAPkBAYEPARyAAEAAAANAF0ABAAAAAAAAgAUACQAcwAAAG4LcAAAAAB4nHWRzWrCQBSFT+pPqUIXLXTTzayKUohGKIibCoLuhbrrYtTRxCYZmYyKyz5Fd32HvlDfoO/QkziIFJtw9bvnnpl7ZwLgBt/wcHieGAf2UGd24Atcou+4RH3kuEweO66QXx1XyaHjGh6ROa7jFp/cwStfMVvhy7GHO+/e8QWuvcBxifqz4zL5xXGF/Oa4Sn53XMPE+3Bcx4P3M9DrvYmWoRWNQVN02kFXTPdCU4pSGQu5saE2meiLhU6timPtz3SSs9ypTCdqrJabWJoT5QQnymSRTkXgt0/UkUqVkVbN807ZdtmxdiEWRidi6HqItdErNbN+aO2612qd9sYAGmvsYRBhyUu0EGhQbfK/gzYCdElTOgSdB1eEFBIxFYkNV4RFJWPeZyyYpVQVHTHZx4y/yVGX2LGWFZri51TccUOn5B7nPefVCSPvGhVVwUl9znveO2KkhV8Wk82PZ8qwZf8OVcu1+fSmWCMw/HMOwXvKaysqM+p+cVuWag8tvv+c+xdd+4+teJxtjUEOwiAURJla24KliQfhUA2g/Sl+CKXx+loNrpzVezOLEY34Ron/0WhwQoszOvQYIKFwwQiNSbSBeO2SZ0tBP4j3zVjKNng32ZmtD1VVXCuOiw/pJ8S3WOU6l+K5UOTaDC4+2TjKMtN9KQf1ezLx/Sg/00FCvABHhjDjAAB4nGPw3sFwIihiIyNjX+QGxp0cDBwMyQUbGVidNjEwMmiBGJu5mBg5ICw+BjCLzWkX0wGgNCeQze60i8EBwmZmcNmowtgRGLHBoSNiI3OKy0Y1EG8XRwMDI4tDR3JIBEhJJBBs5mFi5NHawfi/dQNL70YmBhcADHYj9AAA)
format
(
'woff'
);
}
.markdown-body
{
font-family
:
sans-serif
;
-ms-text-size-adjust
:
100%
;
-webkit-text-size-adjust
:
100%
;
color
:
#333333
;
overflow
:
hidden
;
font-family
:
"Helvetica Neue"
,
Helvetica
,
"Segoe UI"
,
Arial
,
freesans
,
sans-serif
;
font-size
:
16px
;
line-height
:
1.6
;
word-wrap
:
break-word
;
}
.markdown-body
a
{
background
:
transparent
;
}
.markdown-body
a
:active
,
.markdown-body
a
:hover
{
outline
:
0
;
}
.markdown-body
b
,
.markdown-body
strong
{
font-weight
:
bold
;
}
.markdown-body
mark
{
background
:
#ff0
;
color
:
#000
;
font-style
:
italic
;
font-weight
:
bold
;
}
.markdown-body
sub
,
.markdown-body
sup
{
font-size
:
75%
;
line-height
:
0
;
position
:
relative
;
vertical-align
:
baseline
;
}
.markdown-body
sup
{
top
:
-0.5em
;
}
.markdown-body
sub
{
bottom
:
-0.25em
;
}
.markdown-body
h1
{
font-size
:
2em
;
margin
:
0.67em
0
;
}
.markdown-body
img
{
border
:
0
;
}
.markdown-body
hr
{
-moz-box-sizing
:
content-box
;
box-sizing
:
content-box
;
height
:
0
;
}
.markdown-body
pre
{
overflow
:
auto
;
}
.markdown-body
code
,
.markdown-body
kbd
,
.markdown-body
pre
,
.markdown-body
samp
{
font-family
:
monospace
,
monospace
;
font-size
:
1em
;
}
.markdown-body
input
{
color
:
inherit
;
font
:
inherit
;
margin
:
0
;
}
.markdown-body
html
input
[
disabled
]
{
cursor
:
default
;
}
.markdown-body
input
{
line-height
:
normal
;
}
.markdown-body
input
[
type
=
"checkbox"
]
{
box-sizing
:
border-box
;
padding
:
0
;
}
.markdown-body
table
{
border-collapse
:
collapse
;
border-spacing
:
0
;
}
.markdown-body
td
,
.markdown-body
th
{
padding
:
0
;
}
.markdown-body
.codehilitetable
{
border
:
0
;
border-spacing
:
0
;
}
.markdown-body
.codehilitetable
tr
{
border
:
0
;
}
.markdown-body
.codehilitetable
pre
,
.markdown-body
.codehilitetable
div
.codehilite
{
margin
:
0
;
}
.markdown-body
.linenos
,
.markdown-body
.code
,
.markdown-body
.codehilitetable
td
{
border
:
0
;
padding
:
0
;
}
.markdown-body
td
:not
(
.linenos
)
.linenodiv
{
padding
:
0
!important
;
}
.markdown-body
.code
{
width
:
100%
;
}
.markdown-body
.linenos
div
pre
,
.markdown-body
.linenodiv
pre
,
.markdown-body
.linenodiv
{
border
:
0
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
-webkit-border-top-left-radius
:
3px
;
-webkit-border-bottom-left-radius
:
3px
;
-moz-border-radius-topleft
:
3px
;
-moz-border-radius-bottomleft
:
3px
;
border-top-left-radius
:
3px
;
border-bottom-left-radius
:
3px
;
}
.markdown-body
.code
div
pre
,
.markdown-body
.code
div
{
border
:
0
;
-webkit-border-radius
:
0
;
-moz-border-radius
:
0
;
border-radius
:
0
;
-webkit-border-top-right-radius
:
3px
;
-webkit-border-bottom-right-radius
:
3px
;
-moz-border-radius-topright
:
3px
;
-moz-border-radius-bottomright
:
3px
;
border-top-right-radius
:
3px
;
border-bottom-right-radius
:
3px
;
}
.markdown-body
*
{
-moz-box-sizing
:
border-box
;
box-sizing
:
border-box
;
}
.markdown-body
input
{
font
:
13px
Helvetica
,
arial
,
freesans
,
clean
,
sans-serif
,
"Segoe UI Emoji"
,
"Segoe UI Symbol"
;
line-height
:
1.4
;
}
.markdown-body
a
{
color
:
#4183c4
;
text-decoration
:
none
;
}
.markdown-body
a
:hover
,
.markdown-body
a
:focus
,
.markdown-body
a
:active
{
text-decoration
:
underline
;
}
.markdown-body
hr
{
height
:
0
;
margin
:
15px
0
;
overflow
:
hidden
;
background
:
transparent
;
border
:
0
;
border-bottom
:
1px
solid
#ddd
;
}
.markdown-body
hr
:before
,
.markdown-body
hr
:after
{
display
:
table
;
content
:
" "
;
}
.markdown-body
hr
:after
{
clear
:
both
;
}
.markdown-body
h1
,
.markdown-body
h2
,
.markdown-body
h3
,
.markdown-body
h4
,
.markdown-body
h5
,
.markdown-body
h6
{
margin-top
:
15px
;
margin-bottom
:
15px
;
line-height
:
1.1
;
}
.markdown-body
h1
{
font-size
:
30px
;
}
.markdown-body
h2
{
font-size
:
21px
;
}
.markdown-body
h3
{
font-size
:
16px
;
}
.markdown-body
h4
{
font-size
:
14px
;
}
.markdown-body
h5
{
font-size
:
12px
;
}
.markdown-body
h6
{
font-size
:
11px
;
}
.markdown-body
blockquote
{
margin
:
0
;
}
.markdown-body
ul
,
.markdown-body
ol
{
padding
:
0
;
margin-top
:
0
;
margin-bottom
:
0
;
}
.markdown-body
ol
ol
,
.markdown-body
ul
ol
{
list-style-type
:
lower-roman
;
}
.markdown-body
ul
ul
ol
,
.markdown-body
ul
ol
ol
,
.markdown-body
ol
ul
ol
,
.markdown-body
ol
ol
ol
{
list-style-type
:
lower-alpha
;
}
.markdown-body
dd
{
margin-left
:
0
;
}
.markdown-body
code
,
.markdown-body
pre
,
.markdown-body
samp
{
font-family
:
Consolas
,
"Liberation Mono"
,
Menlo
,
Courier
,
monospace
;
font-size
:
12px
;
}
.markdown-body
pre
{
margin-top
:
0
;
margin-bottom
:
0
;
}
.markdown-body
kbd
{
background-color
:
#e7e7e7
;
background-image
:
-moz-linear-gradient
(
#fefefe
,
#e7e7e7
);
background-image
:
-webkit-linear-gradient
(
#fefefe
,
#e7e7e7
);
background-image
:
linear-gradient
(
#fefefe
,
#e7e7e7
);
background-repeat
:
repeat-x
;
border-radius
:
2px
;
border
:
1px
solid
#cfcfcf
;
color
:
#000
;
padding
:
3px
5px
;
line-height
:
10px
;
font
:
11px
Consolas
,
"Liberation Mono"
,
Menlo
,
Courier
,
monospace
;
display
:
inline-block
;
}
.markdown-body
>*
:first-child
{
margin-top
:
0
!important
;
}
.markdown-body
>*
:last-child
{
margin-bottom
:
0
!important
;
}
.markdown-body
.headerlink
{
font
:
normal
400
16px
fontawesome-mini
;
vertical-align
:
middle
;
margin-left
:
-16px
;
float
:
left
;
display
:
inline-block
;
text-decoration
:
none
;
opacity
:
0
;
color
:
#333
;
}
.markdown-body
.headerlink
:focus
{
outline
:
none
;
}
.markdown-body
h1
.headerlink
{
margin-top
:
0.8rem
;
}
.markdown-body
h2
.headerlink
,
.markdown-body
h3
.headerlink
{
margin-top
:
0.6rem
;
}
.markdown-body
h4
.headerlink
{
margin-top
:
0.2rem
;
}
.markdown-body
h5
.headerlink
,
.markdown-body
h6
.headerlink
{
margin-top
:
0
;
}
.markdown-body
.headerlink
:hover
,
.markdown-body
h1
:hover
.headerlink
,
.markdown-body
h2
:hover
.headerlink
,
.markdown-body
h3
:hover
.headerlink
,
.markdown-body
h4
:hover
.headerlink
,
.markdown-body
h5
:hover
.headerlink
,
.markdown-body
h6
:hover
.headerlink
{
opacity
:
1
;
text-decoration
:
none
;
}
.markdown-body
h1
{
padding-bottom
:
0.3em
;
font-size
:
2.25em
;
line-height
:
1.2
;
border-bottom
:
1px
solid
#eee
;
}
.markdown-body
h2
{
padding-bottom
:
0.3em
;
font-size
:
1.75em
;
line-height
:
1.225
;
border-bottom
:
1px
solid
#eee
;
}
.markdown-body
h3
{
font-size
:
1.5em
;
line-height
:
1.43
;
}
.markdown-body
h4
{
font-size
:
1.25em
;
}
.markdown-body
h5
{
font-size
:
1em
;
}
.markdown-body
h6
{
font-size
:
1em
;
color
:
#777
;
}
.markdown-body
p
,
.markdown-body
blockquote
,
.markdown-body
ul
,
.markdown-body
ol
,
.markdown-body
dl
,
.markdown-body
table
,
.markdown-body
pre
,
.markdown-body
.admonition
{
margin-top
:
0
;
margin-bottom
:
16px
;
}
.markdown-body
hr
{
height
:
4px
;
padding
:
0
;
margin
:
16px
0
;
background-color
:
#e7e7e7
;
border
:
0
none
;
}
.markdown-body
ul
,
.markdown-body
ol
{
padding-left
:
2em
;
}
.markdown-body
ul
ul
,
.markdown-body
ul
ol
,
.markdown-body
ol
ol
,
.markdown-body
ol
ul
{
margin-top
:
0
;
margin-bottom
:
0
;
}
.markdown-body
li
>
p
{
margin-top
:
16px
;
}
.markdown-body
dl
{
padding
:
0
;
}
.markdown-body
dl
dt
{
padding
:
0
;
margin-top
:
16px
;
font-size
:
1em
;
font-style
:
italic
;
font-weight
:
bold
;
}
.markdown-body
dl
dd
{
padding
:
0
16px
;
margin-bottom
:
16px
;
}
.markdown-body
blockquote
{
padding
:
0
15px
;
color
:
#777
;
border-left
:
4px
solid
#ddd
;
}
.markdown-body
blockquote
>
:first-child
{
margin-top
:
0
;
}
.markdown-body
blockquote
>
:last-child
{
margin-bottom
:
0
;
}
.markdown-body
table
{
display
:
block
;
width
:
100%
;
overflow
:
auto
;
word-break
:
normal
;
word-break
:
keep-all
;
}
.markdown-body
table
th
{
font-weight
:
bold
;
}
.markdown-body
table
th
,
.markdown-body
table
td
{
padding
:
6px
13px
;
border
:
1px
solid
#ddd
;
}
.markdown-body
table
tr
{
background-color
:
#fff
;
border-top
:
1px
solid
#ccc
;
}
.markdown-body
table
tr
:nth-child
(
2
n
)
{
background-color
:
#f8f8f8
;
}
.markdown-body
img
{
max-width
:
100%
;
-moz-box-sizing
:
border-box
;
box-sizing
:
border-box
;
}
.markdown-body
code
,
.markdown-body
samp
{
padding
:
0
;
padding-top
:
0.2em
;
padding-bottom
:
0.2em
;
margin
:
0
;
font-size
:
85%
;
background-color
:
rgba
(
0
,
0
,
0
,
0.04
);
border-radius
:
3px
;
}
.markdown-body
code
:before
,
.markdown-body
code
:after
{
letter-spacing
:
-0.2em
;
content
:
"\00a0"
;
}
.markdown-body
pre
>
code
{
padding
:
0
;
margin
:
0
;
font-size
:
100%
;
word-break
:
normal
;
white-space
:
pre
;
background
:
transparent
;
border
:
0
;
}
.markdown-body
.codehilite
{
margin-bottom
:
16px
;
}
.markdown-body
.codehilite
pre
,
.markdown-body
pre
{
padding
:
16px
;
overflow
:
auto
;
font-size
:
85%
;
line-height
:
1.45
;
background-color
:
#f7f7f7
;
border-radius
:
3px
;
}
.markdown-body
.codehilite
pre
{
margin-bottom
:
0
;
word-break
:
normal
;
}
.markdown-body
pre
{
word-wrap
:
normal
;
}
.markdown-body
pre
code
{
display
:
inline
;
max-width
:
initial
;
padding
:
0
;
margin
:
0
;
overflow
:
initial
;
line-height
:
inherit
;
word-wrap
:
normal
;
background-color
:
transparent
;
border
:
0
;
}
.markdown-body
pre
code
:before
,
.markdown-body
pre
code
:after
{
content
:
normal
;
}
/* Admonition */
.markdown-body
.admonition
{
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
position
:
relative
;
border-radius
:
3px
;
border
:
1px
solid
#e0e0e0
;
border-left
:
6px
solid
#333
;
padding
:
10px
10px
10px
30px
;
}
.markdown-body
.admonition
table
{
color
:
#333
;
}
.markdown-body
.admonition
p
{
padding
:
0
;
}
.markdown-body
.admonition-title
{
font-weight
:
bold
;
margin
:
0
;
}
.markdown-body
.admonition
>
.admonition-title
{
color
:
#333
;
}
.markdown-body
.attention
>
.admonition-title
{
color
:
#a6d796
;
}
.markdown-body
.caution
>
.admonition-title
{
color
:
#d7a796
;
}
.markdown-body
.hint
>
.admonition-title
{
color
:
#96c6d7
;
}
.markdown-body
.danger
>
.admonition-title
{
color
:
#c25f77
;
}
.markdown-body
.question
>
.admonition-title
{
color
:
#96a6d7
;
}
.markdown-body
.note
>
.admonition-title
{
color
:
#d7c896
;
}
.markdown-body
.admonition
:before
,
.markdown-body
.attention
:before
,
.markdown-body
.caution
:before
,
.markdown-body
.hint
:before
,
.markdown-body
.danger
:before
,
.markdown-body
.question
:before
,
.markdown-body
.note
:before
{
font
:
normal
normal
16px
fontawesome-mini
;
-moz-osx-font-smoothing
:
grayscale
;
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
;
line-height
:
1.5
;
color
:
#333
;
position
:
absolute
;
left
:
0
;
top
:
0
;
padding-top
:
10px
;
padding-left
:
10px
;
}
.markdown-body
.admonition
:before
{
content
:
"\f056\00a0"
;
color
:
333
;
}
.markdown-body
.attention
:before
{
content
:
"\f058\00a0"
;
color
:
#a6d796
;
}
.markdown-body
.caution
:before
{
content
:
"\f06a\00a0"
;
color
:
#d7a796
;
}
.markdown-body
.hint
:before
{
content
:
"\f05a\00a0"
;
color
:
#96c6d7
;
}
.markdown-body
.danger
:before
{
content
:
"\f057\00a0"
;
color
:
#c25f77
;
}
.markdown-body
.question
:before
{
content
:
"\f059\00a0"
;
color
:
#96a6d7
;
}
.markdown-body
.note
:before
{
content
:
"\f040\00a0"
;
color
:
#d7c896
;
}
.markdown-body
.admonition
::after
{
content
:
normal
;
}
.markdown-body
.attention
{
border-left
:
6px
solid
#a6d796
;
}
.markdown-body
.caution
{
border-left
:
6px
solid
#d7a796
;
}
.markdown-body
.hint
{
border-left
:
6px
solid
#96c6d7
;
}
.markdown-body
.danger
{
border-left
:
6px
solid
#c25f77
;
}
.markdown-body
.question
{
border-left
:
6px
solid
#96a6d7
;
}
.markdown-body
.note
{
border-left
:
6px
solid
#d7c896
;
}
.markdown-body
.admonition
>*
:first-child
{
margin-top
:
0
!important
;
}
.markdown-body
.admonition
>*
:last-child
{
margin-bottom
:
0
!important
;
}
/* progress bar*/
.markdown-body
.progress
{
display
:
block
;
width
:
300px
;
margin
:
10px
0
;
height
:
24px
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
;
background-color
:
#ededed
;
position
:
relative
;
box-shadow
:
inset
-1px
1px
3px
rgba
(
0
,
0
,
0
,
.1
);
}
.markdown-body
.progress-label
{
position
:
absolute
;
text-align
:
center
;
font-weight
:
bold
;
width
:
100%
;
margin
:
0
;
line-height
:
24px
;
color
:
#333
;
text-shadow
:
1px
1px
0
#fefefe
,
-1px
-1px
0
#fefefe
,
-1px
1px
0
#fefefe
,
1px
-1px
0
#fefefe
,
0
1px
0
#fefefe
,
0
-1px
0
#fefefe
,
1px
0
0
#fefefe
,
-1px
0
0
#fefefe
,
1px
1px
2px
#000
;
-webkit-font-smoothing
:
antialiased
!important
;
white-space
:
nowrap
;
overflow
:
hidden
;
}
.markdown-body
.progress-bar
{
height
:
24px
;
float
:
left
;
-webkit-border-radius
:
3px
;
-moz-border-radius
:
3px
;
border-radius
:
3px
;
background-color
:
#96c6d7
;
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
.5
),
inset
0
-1px
0
rgba
(
0
,
0
,
0
,
.1
);
background-size
:
30px
30px
;
background-image
:
-webkit-linear-gradient
(
135deg
,
rgba
(
255
,
255
,
255
,
.4
)
27%
,
transparent
27%
,
transparent
52%
,
rgba
(
255
,
255
,
255
,
.4
)
52%
,
rgba
(
255
,
255
,
255
,
.4
)
77%
,
transparent
77%
,
transparent
);
background-image
:
-moz-linear-gradient
(
135deg
,
rgba
(
255
,
255
,
255
,
.4
)
27%
,
transparent
27%
,
transparent
52%
,
rgba
(
255
,
255
,
255
,
.4
)
52%
,
rgba
(
255
,
255
,
255
,
.4
)
77%
,
transparent
77%
,
transparent
);
background-image
:
-ms-linear-gradient
(
135deg
,
rgba
(
255
,
255
,
255
,
.4
)
27%
,
transparent
27%
,
transparent
52%
,
rgba
(
255
,
255
,
255
,
.4
)
52%
,
rgba
(
255
,
255
,
255
,
.4
)
77%
,
transparent
77%
,
transparent
);
background-image
:
-o-linear-gradient
(
135deg
,
rgba
(
255
,
255
,
255
,
.4
)
27%
,
transparent
27%
,
transparent
52%
,
rgba
(
255
,
255
,
255
,
.4
)
52%
,
rgba
(
255
,
255
,
255
,
.4
)
77%
,
transparent
77%
,
transparent
);
background-image
:
linear-gradient
(
135deg
,
rgba
(
255
,
255
,
255
,
.4
)
27%
,
transparent
27%
,
transparent
52%
,
rgba
(
255
,
255
,
255
,
.4
)
52%
,
rgba
(
255
,
255
,
255
,
.4
)
77%
,
transparent
77%
,
transparent
);
}
.markdown-body
.progress-100plus
.progress-bar
{
background-color
:
#a6d796
;
}
.markdown-body
.progress-80plus
.progress-bar
{
background-color
:
#c6d796
;
}
.markdown-body
.progress-60plus
.progress-bar
{
background-color
:
#d7c896
;
}
.markdown-body
.progress-40plus
.progress-bar
{
background-color
:
#d7a796
;
}
.markdown-body
.progress-20plus
.progress-bar
{
background-color
:
#d796a6
;
}
.markdown-body
.progress-0plus
.progress-bar
{
background-color
:
#c25f77
;
}
.markdown-body
.candystripe-animate
.progress-bar
{
-webkit-animation
:
animate-stripes
3s
linear
infinite
;
-moz-animation
:
animate-stripes
3s
linear
infinite
;
animation
:
animate-stripes
3s
linear
infinite
;
}
@-webkit-keyframes
animate-stripes
{
0
%
{
background-position
:
0
0
;
}
100
%
{
background-position
:
60px
0
;
}
}
@-moz-keyframes
animate-stripes
{
0
%
{
background-position
:
0
0
;
}
100
%
{
background-position
:
60px
0
;
}
}
@keyframes
animate-stripes
{
0
%
{
background-position
:
0
0
;
}
100
%
{
background-position
:
60px
0
;
}
}
.markdown-body
.gloss
.progress-bar
{
box-shadow
:
inset
0
4px
12px
rgba
(
255
,
255
,
255
,
.7
),
inset
0
-12px
0
rgba
(
0
,
0
,
0
,
.05
);
}
/* Multimarkdown Critic Blocks */
.markdown-body
.critic_mark
{
background
:
#ff0
;
}
.markdown-body
.critic_delete
{
color
:
#c82829
;
text-decoration
:
line-through
;
}
.markdown-body
.critic_insert
{
color
:
#718c00
;
text-decoration
:
underline
;
}
.markdown-body
.critic_comment
{
color
:
#8e908c
;
font-style
:
italic
;
}
.markdown-body
.headeranchor
{
font
:
normal
normal
16px
fontawesome-mini
;
line-height
:
1
;
display
:
inline-block
;
text-decoration
:
none
;
-webkit-font-smoothing
:
antialiased
;
-moz-osx-font-smoothing
:
grayscale
;
-webkit-user-select
:
none
;
-moz-user-select
:
none
;
-ms-user-select
:
none
;
user-select
:
none
;
}
.headeranchor
:before
{
content
:
'\e157'
;
}
.markdown-body
.task-list-item
{
list-style-type
:
none
;
}
.markdown-body
.task-list-item
+
.task-list-item
{
margin-top
:
3px
;
}
.markdown-body
.task-list-item
input
{
margin
:
0
4px
0.25em
-20px
;
vertical-align
:
middle
;
}
/* Media */
@media
only
screen
and
(
min-width
:
480px
)
{
.markdown-body
{
font-size
:
14px
;
}
}
@media
only
screen
and
(
min-width
:
768px
)
{
.markdown-body
{
font-size
:
16px
;
}
}
@media
print
{
.markdown-body
*
{
background
:
transparent
!important
;
color
:
black
!important
;
filter
:
none
!important
;
-ms-filter
:
none
!important
;
}
.markdown-body
{
font-size
:
12pt
;
max-width
:
100%
;
outline
:
none
;
border
:
0
;
}
.markdown-body
a
,
.markdown-body
a
:visited
{
text-decoration
:
underline
;
}
.markdown-body
.headeranchor-link
{
display
:
none
;
}
.markdown-body
a
[
href
]
:after
{
content
:
" ("
attr
(
href
)
")"
;
}
.markdown-body
abbr
[
title
]
:after
{
content
:
" ("
attr
(
title
)
")"
;
}
.markdown-body
.ir
a
:after
,
.markdown-body
a
[
href
^=
"javascript:"
]
:after
,
.markdown-body
a
[
href
^=
"#"
]
:after
{
content
:
""
;
}
.markdown-body
pre
{
white-space
:
pre
;
white-space
:
pre-wrap
;
word-wrap
:
break-word
;
}
.markdown-body
pre
,
.markdown-body
blockquote
{
border
:
1px
solid
#999
;
padding-right
:
1em
;
page-break-inside
:
avoid
;
}
.markdown-body
.progress
,
.markdown-body
.progress-bar
{
-moz-box-shadow
:
none
;
-webkit-box-shadow
:
none
;
box-shadow
:
none
;
}
.markdown-body
.progress
{
border
:
1px
solid
#ddd
;
}
.markdown-body
.progress-bar
{
height
:
22px
;
border-right
:
1px
solid
#ddd
;
}
.markdown-body
tr
,
.markdown-body
img
{
page-break-inside
:
avoid
;
}
.markdown-body
img
{
max-width
:
100%
!important
;
}
.markdown-body
p
,
.markdown-body
h2
,
.markdown-body
h3
{
orphans
:
3
;
widows
:
3
;
}
.markdown-body
h2
,
.markdown-body
h3
{
page-break-after
:
avoid
;
}
}
</style><style>
/*github*/
.codehilite
{
background-color
:
#fff
;
color
:
#333333
;}
.codehilite
.hll
{
background-color
:
#ffffcc
;}
.codehilite
.c
{
color
:
#999988
;
font-style
:
italic
}
.codehilite
.err
{
color
:
#a61717
;
background-color
:
#e3d2d2
}
.codehilite
.k
{
font-weight
:
bold
}
.codehilite
.o
{
font-weight
:
bold
}
.codehilite
.cm
{
color
:
#999988
;
font-style
:
italic
}
.codehilite
.cp
{
color
:
#999999
;
font-weight
:
bold
}
.codehilite
.c1
{
color
:
#999988
;
font-style
:
italic
}
.codehilite
.cs
{
color
:
#999999
;
font-weight
:
bold
;
font-style
:
italic
}
.codehilite
.gd
{
color
:
#000000
;
background-color
:
#ffdddd
}
.codehilite
.ge
{
font-style
:
italic
}
.codehilite
.gr
{
color
:
#aa0000
}
.codehilite
.gh
{
color
:
#999999
}
.codehilite
.gi
{
color
:
#000000
;
background-color
:
#ddffdd
}
.codehilite
.go
{
color
:
#888888
}
.codehilite
.gp
{
color
:
#555555
}
.codehilite
.gs
{
font-weight
:
bold
}
.codehilite
.gu
{
color
:
#800080
;
font-weight
:
bold
}
.codehilite
.gt
{
color
:
#aa0000
}
.codehilite
.kc
{
font-weight
:
bold
}
.codehilite
.kd
{
font-weight
:
bold
}
.codehilite
.kn
{
font-weight
:
bold
}
.codehilite
.kp
{
font-weight
:
bold
}
.codehilite
.kr
{
font-weight
:
bold
}
.codehilite
.kt
{
color
:
#445588
;
font-weight
:
bold
}
.codehilite
.m
{
color
:
#009999
}
.codehilite
.s
{
color
:
#dd1144
}
.codehilite
.n
{
color
:
#333333
}
.codehilite
.na
{
color
:
teal
}
.codehilite
.nb
{
color
:
#0086b3
}
.codehilite
.nc
{
color
:
#445588
;
font-weight
:
bold
}
.codehilite
.no
{
color
:
teal
}
.codehilite
.ni
{
color
:
purple
}
.codehilite
.ne
{
color
:
#990000
;
font-weight
:
bold
}
.codehilite
.nf
{
color
:
#990000
;
font-weight
:
bold
}
.codehilite
.nn
{
color
:
#555555
}
.codehilite
.nt
{
color
:
navy
}
.codehilite
.nv
{
color
:
teal
}
.codehilite
.ow
{
font-weight
:
bold
}
.codehilite
.w
{
color
:
#bbbbbb
}
.codehilite
.mf
{
color
:
#009999
}
.codehilite
.mh
{
color
:
#009999
}
.codehilite
.mi
{
color
:
#009999
}
.codehilite
.mo
{
color
:
#009999
}
.codehilite
.sb
{
color
:
#dd1144
}
.codehilite
.sc
{
color
:
#dd1144
}
.codehilite
.sd
{
color
:
#dd1144
}
.codehilite
.s2
{
color
:
#dd1144
}
.codehilite
.se
{
color
:
#dd1144
}
.codehilite
.sh
{
color
:
#dd1144
}
.codehilite
.si
{
color
:
#dd1144
}
.codehilite
.sx
{
color
:
#dd1144
}
.codehilite
.sr
{
color
:
#009926
}
.codehilite
.s1
{
color
:
#dd1144
}
.codehilite
.ss
{
color
:
#990073
}
.codehilite
.bp
{
color
:
#999999
}
.codehilite
.vc
{
color
:
teal
}
.codehilite
.vg
{
color
:
teal
}
.codehilite
.vi
{
color
:
teal
}
.codehilite
.il
{
color
:
#009999
}
.codehilite
.gc
{
color
:
#999
;
background-color
:
#EAF2F5
}
</style><title>
README
</title></head><body><article
class=
"markdown-body"
><h1
id=
"-tomrecommendersystem"
>
个性化新闻推荐系统
–
TomRecommenderSystem
<a
class=
"headerlink"
href=
"#-tomrecommendersystem"
title=
"Permanent link"
>
</a></h1>
<p>
中文文档 |
<a
href=
"https://github.com/bluemapleman/NewsRecommendSystem/tree/master/docs/English"
>
English Document
</a></p>
<h2
id=
"_1"
>
说明
<a
class=
"headerlink"
href=
"#_1"
title=
"Permanent link"
>
</a></h2>
<p>
本推荐系统使用的推荐算法包括协同过滤(Collaborative Filtering)、基于内容相似度的推荐(Content-based Recommendation)与热点新闻推荐(Hot News Recommendation):
</p>
<ul>
<li>
协同过滤的实现依托于Mahout的提供库;
</li>
<li>
基于内容的相似度推荐在原始算法上基于相关论文做了自主的改进;
</li>
<li>
热点新闻推荐顾名思义是取最近被最多用户浏览过的新闻进行推荐。
</li>
</ul>
<p><strong>
推荐算法的具体细节可参考文件[推荐系统介绍.pdf]
</strong></p>
<p><strong>
主要使用的库(Lib):
</strong></p>
<ul>
<li><a
href=
"https://github.com/NLPchina/ansj_seg"
>
Ansj
</a>
:基于内容的推荐部分用以分词,以及其内含的TFIDF算法。
</li>
<li><a
href=
"http://www.quartz-scheduler.org/"
>
Quartz
</a>
:推荐系统定时运行的设定。
</li>
<li><a
href=
"http://mahout.apache.org/"
>
Mahout
</a>
:使用内置的协同过滤算法。
</li>
<li><a
href=
"http://www.jfinal.com/"
>
Jfinal
</a>
:使用内置的ActiveRecord与Db工具,对推荐系统中的数据库表做了实体类映射,以简化数据库相关操作。
</li>
</ul>
<p>
本推荐系统需要基于【新闻模块】使用,此处对于【新闻模块】的定义是:
<strong>
有规律地进行新闻采集,并通过公共平台对用户进行新闻展示与推送的应用。
</strong>
当然,这是实际应用的需求,如果只是自己做研究或者实验的话,可以只使用
<a
href=
"https://github.com/bluemapleman/NewsRecommendSystem/blob/master/test_data.sql"
>
测试数据
</a>
即可。
</p>
<h2
id=
"_2"
>
使用
<a
class=
"headerlink"
href=
"#_2"
title=
"Permanent link"
>
</a></h2>
<h3
id=
"_3"
>
预备工作
<a
class=
"headerlink"
href=
"#_3"
title=
"Permanent link"
>
</a></h3>
<h4
id=
"_4"
>
一、数据库配合
<a
class=
"headerlink"
href=
"#_4"
title=
"Permanent link"
>
</a></h4>
<p>
(
<strong>
该步骤主要是为了说明推荐系统要求交互的数据。真实建库的话,直接在新建的数据库中运行
<a
href=
"https://github.com/bluemapleman/NewsRecommendSystem/blob/master/test_data.sql"
>
测试数据
</a>
,即可完成所有建表工作,附带提供的测试数据。
</strong>
)
</p>
<p><strong>
本推荐系统目前只支持与MYSQL数据库进行交互
</strong></p>
<p>
本系统需要与五个表进行交互:用户表(users),新闻表(news),新闻模块表(newsmodules),浏览记录表(newslogs),推荐结果表(Recommendations)。
</p>
<ul>
<li>
用户表users
</li>
</ul>
<p>
存储用户基本信息的表。要求至少拥有两个字段:用户id(id:bigint),用户喜好关键词列表(pref_list:json),用户最近登录时间(latest_log_time:timestamp)。
</p>
<table>
<thead>
<tr>
<th>
字段名
</th>
<th>
类型
</th>
<th>
非空
</th>
<th>
主键
</th>
<th>
外键
</th>
<th>
自增
</th>
<th>
默认值
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
</tr>
<tr>
<td>
pref_list
</td>
<td>
text
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td
_moduleid1_:_=
""moduleid1":{"
></td>
</tr>
<tr>
<td>
latest_log_time
</td>
<td>
timestamp
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<ul>
<li>
新闻表news
</li>
</ul>
<p>
存储新闻基本信息的表。要求至少拥有三个字段:新闻id(id:bigint),新闻文本内容(content:text),所属模块(module_id)。
</p>
<table>
<thead>
<tr>
<th>
字段名
</th>
<th>
类型
</th>
<th>
非空
</th>
<th>
主键
</th>
<th>
外键
</th>
<th>
自增
</th>
<th>
默认值
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
</tr>
<tr>
<td>
title
</td>
<td>
text
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
content
</td>
<td>
text
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
module_id
</td>
<td>
int
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<ul>
<li>
新闻模块表newsmodules
</li>
</ul>
<p>
存储新闻模块信息的表。要求至少拥有两个字段:模块id(id:int),模块名称(name:text),抓取时间/新闻日期(news_time:timestamp)。
</p>
<table>
<thead>
<tr>
<th>
字段名
</th>
<th>
类型
</th>
<th>
非空
</th>
<th>
主键
</th>
<th>
外键
</th>
<th>
自增
</th>
<th>
默认值
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
id
</td>
<td>
int
</td>
<td>
yes
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
</tr>
<tr>
<td>
name
</td>
<td>
text
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
news_time
</td>
<td>
timestamp
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<ul>
<li>
浏览记录表newslogs
</li>
</ul>
<p>
存储用户浏览新闻记录的表。要求至少拥有三个字段:记录id(id:bigint),用户id(user_id:bigint),新闻id(news_id:bigint),浏览时间(view_time:timestamp),用户对新闻的偏好程度(prefer_degree[0:仅仅浏览,1:评论,2:收藏])。
</p>
<table>
<thead>
<tr>
<th>
字段名
</th>
<th>
类型
</th>
<th>
非空
</th>
<th>
主键
</th>
<th>
外键
</th>
<th>
自增
</th>
<th>
默认值
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
</tr>
<tr>
<td>
user_id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
news_id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
view_time
</td>
<td>
timestamp
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
prefer_degree
</td>
<td>
int
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<ul>
<li>
推荐结果表Recommendations
</li>
</ul>
<p>
存储推荐系统为用户生成的推荐结果及用户反馈的表。要求至少拥有五个字段:推荐结果id(id:bigint),用户id(user_id:bigint),新闻id(news_id:bigint),推荐结果生成时间戳(derive_time:timestamp),用户反馈(feedback:bit[0:用户未浏览,1:用户进行了浏览]),结果生成的对应推荐算法(derive_algorithm:int[0:协同过滤,1:基于内容的推荐,2:热点新闻推荐])
</p>
<table>
<thead>
<tr>
<th>
字段名
</th>
<th>
类型
</th>
<th>
非空
</th>
<th>
主键
</th>
<th>
外键
</th>
<th>
自增
</th>
<th>
默认值
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
</tr>
<tr>
<td>
user_id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
news_id
</td>
<td>
bigint
</td>
<td>
yes
</td>
<td></td>
<td>
yes
</td>
<td></td>
<td></td>
</tr>
<tr>
<td>
derive_time
</td>
<td>
timestamp
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>
feedback
</td>
<td>
bit
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>
0
</td>
</tr>
<tr>
<td>
derive_algorithm
</td>
<td>
int
</td>
<td>
yes
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4
id=
"_5"
>
二、数据库连接配置
<a
class=
"headerlink"
href=
"#_5"
title=
"Permanent link"
>
</a></h4>
<p>
在项目根目录下的res目录下,修改dbconfig.properties文件中有关数据库的配置:
</p>
<div
class=
"codehilite"
><pre>
url = jdbc:mysql://[数据库ip]/[数据库名]?useUnicode=true
&
characterEncoding=utf8
user = [登录用户名]
password = [登录密码]
</pre></div>
<p><strong>
注意,数据库的编码设置应为UTF8。
</strong></p>
<h3
id=
"-quick-start"
>
系统启动-Quick Start
<a
class=
"headerlink"
href=
"#-quick-start"
title=
"Permanent link"
>
</a></h3>
<p>
完成数据库配置后,依次四个步骤:
</p>
<p>
1.在com.qianxinyao.TomNewsRecommender包下,找到类Main;
</p>
<p>
2.选择推荐算法。设置boolean类型的enableCB,enableCF,enableHR变量,分别代表推荐过程中是否启用协同过滤推荐算法、基于内容的推荐算法、基于热点新闻的推荐算法。若均设为true,表示三种算法均工作,一起为用户生成推荐结果;
</p>
<p>
3.选择推荐对象。推荐对象分为三种:全体用户,活跃用户(最近一段时间有登录行为)与自定义用户(自己指定的用户),若选择自定义用户,需要构建包含目标用户id(long)的List
<Long>
;
</p>
<p>
4.选择系统运行方式。运行方式分为两种:一次运行和定时运行。一次运行即只为用户进行一次推荐生成,生成结束后则系统停止,若要再生成推荐,需要重新启动系统。而定时运行则可以定时为用户生成推荐结果,若不强制停止系统,则系统会一直运行下去。(定时运行时间在paraConfig.properties文件中设定)
</p>
<p>
以下是示例代码:
</p>
<div
class=
"codehilite"
><pre>
package com.qianxinyao.TomNewsRecommender;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
/**
* @author bluemapleman
* @email tomqianmaple@gmail.com
* @github https://github.com/bluemapleman
* @date 2016年10月20日
* 推荐系统入口类,在此启动推荐系统。
*/
public class Main
{
public static final Logger logger = Logger.getLogger(Main.class);
/**
* 推荐系统运行入口
* @param args
*/
public static void main(String[] args)
{
//选择要在推荐系统中运行的推荐算法
boolean enableCF=true,enableCB=false,enableHR=false;
List
<
Long
>
userList=new ArrayList
<
Long
>
();
userList.add(1L);
userList.add(2L);
userList.add(3L);
//为指定用户执行一次推荐
new JobSetter(enableCF,enableCB,enableHR).executeInstantJobForCertainUsers(userList);
//定时执行推荐
// new JobSetter(enableCF,enableCB,enableHR).executeQuartzJob(forActiveUsers);
}
}
</pre></div>
<h3
id=
"_6"
>
日常使用
<a
class=
"headerlink"
href=
"#_6"
title=
"Permanent link"
>
</a></h3>
<p>
系统运行的各类参数都可以在根目录下src/main/res目录下的paraConfig.properties文件中进行配置。默认配置是推荐配置。
</p>
<p>
若需要推荐系统能在每次生成有效的推荐,只要【新闻模块】保持以一定频率抓取一定量的新闻并入库news表。(最好与推荐系统定时推荐的频率相同,并在推荐系统运行之前完成一次抓取,推荐每天抓取一次新闻,并进行一次推荐生成。)
</p>
<p><strong>
注意:入库的新闻要标注module_id,详情可参见数据库表与com.qianxinyao.TomNewsRecommender包下的NewsScraper类中的代码。
</strong></p>
<h2
id=
"_7"
>
测试数据
<a
class=
"headerlink"
href=
"#_7"
title=
"Permanent link"
>
</a></h2>
<p>
在Mysql数据库中运行data.sql中的sql语句,可生成数据库结构与测试数据。
</p>
<p>
测试数据中包含以下几个部分:
</p>
<ul>
<li>
users表:7个测试用户
</li>
<li>
news表:306个2017-12-12日从网易首页抓取的测试新闻
</li>
<li>
newsmodules表:17个测试模块
</li>
<li>
newslogs:测试推荐算法效果用的9条浏览记录
</li>
</ul>
<p>
要查看推荐系统在测试数据上运行的效果,只需在Main类下执行:
</p>
<div
class=
"codehilite"
><pre>
//在测试数据上运行
new TestDataRunner().runTestData();
</pre></div>
<p>
预期的推荐生成结果如下:
</p>
<ul>
<li>
若对测试数据进行一次协同过滤,将生成0条推荐。
</li>
<li>
若对测试数据进行一次基于内容的推荐,将为用户1(id=1)推荐85,87,89,104这四条新闻(有重复标题的新闻,新闻标题中的“合同”关键词匹配上了用户的喜好关键词),为用户2推荐89新闻(重复标题的新闻),推荐用户3推荐87,85,100这三条新闻(新闻标题中的“合同”关键词匹配上了用户的喜好关键词)。
</li>
<li>
若对测试数据进行一次基于热点新闻的推荐,将分别为用户1推荐103,104,为用户2推荐100,104,为用户3推荐100,101,因为最近被浏览得最多的新闻就是这三个拥有浏览记录的用户看过的那些新闻(100,101,102,103,104)。
</li>
</ul>
<h2
id=
"_8"
>
额外说明
<a
class=
"headerlink"
href=
"#_8"
title=
"Permanent link"
>
</a></h2>
<p>
1.com.qianxinyao.TomNewsRecommender下的NewsScraper类是抓取网易的测试新闻时用的类,大家也可以用这个类继续采集新闻。该类默认对网易新闻首页的所有新闻进行一次抓取入库。
</p>
<p>
2.协同过滤的效果目前不太稳定/可控,因为采用的是Mahout内置的协同过滤工具。一般来说,新闻模块的活跃用户越多,则协同过滤效果越好,也越明显。若有需求,我会在后期自己实现能稳定生成指定数量的推荐结果的协同过滤算法。
</p>
<p>
3.一般当协同过滤与基于内容的推荐算法生成的推荐数目不足时,可以用基于热点新闻的推荐进行数量补充。
</p>
<h1
id=
"_9"
>
更新日志
<a
class=
"headerlink"
href=
"#_9"
title=
"Permanent link"
>
</a></h1>
<p><strong>
欢迎大家踊跃提出自己对该推荐系统的任何想法和建议!
</strong></p>
<table>
<thead>
<tr>
<th>
版本
</th>
<th>
日期
</th>
<th>
特性
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
V1.0.0
</td>
<td>
2018/10/04
</td>
<td>
规整README.md说明文档,使之更加易懂理解。
</td>
</tr>
<tr>
<td>
V1.0.1
</td>
<td>
开发中
</td>
<td>
1. 自主实现Java版本的TFIDF算法,或者整理一份训练语料库,以达到更好的关键词提取效果;
<br>
2.改善基于内容的推荐算法的匹配程度计算方法,使之更加高效。(若用户的偏好列表中有数千喜好关键词,若将一千条最近的新闻与该用户做匹配,后台计算出推荐结果列表只需要
<em>
100ms
</em>
,不考虑网络传输等其他时间因素)
</td>
</tr>
</tbody>
</table></article></body></html>
\ No newline at end of file
README.md
浏览文件 @
4cc51d48
# 个性化新闻推荐系统--TomRecommenderSystem
**若有任何有关项目的问题(导入、运行、后期改进、需求等等),欢迎首先在issue里提出,我会随时查看并积极回复!谢谢大家!**
中文文档 |
[
English Document
](
https://github.com/bluemapleman/NewsRecommendSystem/tree/master/docs/English
)
## 说明
...
...
@@ -107,7 +109,7 @@ user = [登录用户名]
password = [登录密码]
```
**注意,数据库的编码设置应为
UTF8。
**
**注意,数据库的编码设置应为
utf8mb4。(mb4支持emoji字符)
**
### 系统启动-Quick Start
...
...
docs/English/README.md
浏览文件 @
4cc51d48
# Tom's News Recommender -- personal news recommendation system
[
中文文档
](
https://github.com/bluemapleman/NewsRecommendSystem
)
## Basic Information
This recommender needs to cooperate with a [News Module]. Here the definition of [News Module] is an application with following features:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录