基于NLP的小说推荐

1 需求分析

  这个项目是我在使用QQ阅读时而自然而然的产生的想法,它源于QQ阅读目前的主流推荐方式的不足:(1)基于阅读历史记录的Top-N推荐;(2)基于标签选择的相似内容推荐。前者给我的推荐无法让我眼前一亮,后者的自定义标签组合太少,往往在我给出一种组合后,还需要翻阅半天才能找到一个比较有意思的小说(很多时候甚至无法找到),这启示着我,其实目前的小说推荐算法并不完备,它没有赋予用户更多的自定义推荐内容的自由度。
  基于此,我参考目前很多的语义推荐系统,提出了一种结合语义分析的小说推荐。用户可以自定义自己想看或者不想看的内容,在文本框中进行输入,服务器会对用户的语义进行粗分析,并从数据库中召回大量相关小说。之后再对语义进行精准匹配,并对找回小说进行精排,精排结果以Top-N的形式展示给用户。
  项目搭建完成并测试通过后,希望可以提供给大家一个免费的小说精确查找途径,供大家自由组合自己想看的内容,解决书荒

2 工期安排

  该项目的工期安排将分为三阶段进行:
  1、前期准备:


  • 小说数据采集,以h5文件形式保存(高效读写,表关系非常好建立,可以呈现递进结构)
      - [ ] 阅次元小说名称+简介采集
      - [ ] 采集数据去脏,标准化格式
      - [ ] 先按大分类(参考起点)存入h5文件
  • NLP方案查找
      - [ ] NLP情感分析——用于提取用户的喜欢与不喜欢语句,建立用户偏好集合
      - [ ] NLP文本提取——用于提取关键词,完善用户偏好向量

  2、本地实现:

  • NLP方案实现
      - [ ] 情感分析
      - [ ] 文本提取
  • NLP方案验证
      - [ ] 验证文本提取应用在小说简介上,是否可以高效的提取出我们希望产生的关键词(以及关键词的类别,以及不同类别中,关键词的粗精程度)
      - [ ] 验证情感分析分辨喜好语句与讨厌语句的准确率
  • 推荐算法实现
      - [ ] 基于内容的推荐算法,通过用户关键词向量与物品关键词向量进行匹配
        - [ ] 分类关键词与标签关键词的设计

例如:“玄幻”就是最粗的分类关键词,而“加藤惠”就是最精的标签关键词

  3、项目上云:


3 关键技术

3.1 NLP技术

  NLP技术目前考虑利用两类方法,分别是NLP情感分析——用于提取用户的喜欢与不喜欢语句,建立用户偏好集合,以及NLP文本提取——用于提取关键词,完善用户偏好向量,其中NLP文本提取提取出的关键词,必须包含该关键词的粗精程度,以方便推荐算法的工作。

3.1.1 情感分析

  参考文献:

[1] 文本情感分析方法研究综述 杨婷

[2]

[3] 基于权值算法的中文情感分析系统研究与实现

[4] Chinese Text Sentiment Analysis Based on Extended Sentiment Dictionary

  情感分析目前有三类方法:

1、基于情感词典的情感分析

2、基于机器学习的情感分析(分类问题)

3、基于深度学习的情感分析

  可以用下图来表示情感分析目前的研究现状(来自[1]):

nlp绝版书籍48本网盘 nlp 小说_python


  基于情感词典的情感分析,就是对文本中出现的情感词进行加权匹配,并判断它的情感倾向;基于机器学习的情感分析,就是利用训练数据训练出一个分类器做分类;基于深度学习的情感分析,采用了循环神经网络联系上下文,本质也是做分类,但精准度要高于机器学习。

  在本项目中,我们想实现的是对录入语句表达的是喜欢还是讨厌进行区分,区分后的句子作为输出送到文本提取阶段,进行关键词的提取。因此,该任务可以总结为:

输入:一段语句
输出:喜欢句:list 讨厌句:list 中性句:list

  键入需求与评价是不相同的问题,用户在键入需求时,很少会将模棱两可的想法作为描述输入,而更多的是指向性的描述,例如:

喜欢:我想看主角是萧炎的同人小说,女主角最好是云韵
不喜欢:我不想要女主角是萧熏儿

  当然,其实用户的思考方式是多样的,也可能存在用户想通过疑问句的方式来进行输入,例如:

疑问:有没有一本书,它的主角是萧炎,女主是云韵

  对于这类没有一个情感词的,我们将全句处理为中性偏好,录入用户喜好集合
  而做评价时,会出现很多模棱两可、中性、乃至反讽的描述,表明该用户的无倾向性

模棱两可:我看过这个电影后,感觉电影好也不好
中性:这电影一般
反讽:这电影能好看?

  而目前开源的情感分析语料库中,大多数都是微博评论、商品评论、电影评论等等,电影评论的语料库虽不是不能用,但也感觉不太对口,或者杀鸡用牛刀。
由于键入需求时,一般都带着比较明确的情感倾向词,所以在情感分析部分,我们推荐使  用第一类方法即可达到比较好的分类效果。在第一类方法效果不好之后,再考虑转机器学习和深度学习方法,通过语料库训练出一个分类器。
使用第一类方法需要的资源列表:



  • 基于情感词典的情感分析方法:词性加权法,参考文献[3][4],如何加权由词典信息决定
      此外,情感分析获得的权重将为之后文本提取之后关键词在总评分中所占据的权重提供重要参考,也就是代表着用户键入语气越强烈,那么他对于这一个要求的期望值也就越高,对应该关键词的权重也应更大,按照语气强烈程度,我们将其分为五个程度。例如,当用户键入以下内容

语气强烈(喜欢):女主一定要是云韵
语气一般(喜欢):男主可以是萧炎
语气无参考:没啥其他要求
语气一般讨厌:希望女二不是萧熏儿
语气非常讨厌:剧情一定不要虐主

  我们就获得了五个程度的语句,每一个程度提取出的关键词,将为之后的相似度计算提供不同的权重(有正负之分)。

3.1.2 文本提取

[1]

[2]

  其实,本文要实现的文本提取,也就是命名体识别,目前的中文分词包jieba已经可以满足需要(至少比自己训练出来的更好),现总结一下在本项目中会使用到的jieba功能,以及输入输出(顺带一提,清华和哈工大这些研究室真的牛,做出的这些开源库)

首先是自定义词典的导入

  自定义词典是为了适应轻小说推荐的场所,将轻小说常出现的同人书籍、同人动漫、同人电影、同人游戏的名称以及主角名作为词典导入,这里我们从百度词库中下载了一些相关词典如下:

nlp绝版书籍48本网盘 nlp 小说_nlp绝版书籍48本网盘_02


  由于下载下来的是bdict文件,要导入jieba还需要转成txt格式,转换代码可以参考文献[2]

之后可以通过jieba调用词典做导入,代码为

jieba.load_userdict('user_dict.txt')

其次是jieba分词(带词性)
  输入为待分词段

import jieba
import jieba.posseg as psg
psg.lcut(content) #content为待分词段

  输出为分词结果以及词性(list形式)

[('现如今', 't'), (',', 'x'), ('机器', 'n')]

  有关于jieba的词性表,可以参照文献[1]
之后,则是根据分词结果以及自定义词典做匹配,建立初始关键词集合
由于user_dict是可以自定义类型的,比如,我将“萧炎”自定义为novel_name,也就是nn

#user_ditc.txt
word freq flag
萧炎  360  nn

  所以,通过jieba分词,我们可以直接筛选到与我们自定义词典匹配的分词(自定义词典如果与原词典重复,自定义词典的词性会覆盖原词典,即先入先出规则,这一点已验证——例如原词典“萧炎”是nr,通过自定义词典,“萧炎”变成了nn),这些分词可以直接提取出来,辅助之后的关键词建立。

最后,是结构化初始关键词,建立粗精对应表

  建立的粗精对应表主要集中在同人轻小说上,对于其他分类,则会更宽泛一点,粒度不会那么细,粗精对应表,额外加权手段的结构树如下图所示:

nlp绝版书籍48本网盘 nlp 小说_人工智能_03

3.2 推荐算法

  采用基于内容的推荐算法,这部分内容以后再详述

3.3 django项目上云

  这部分知识,可以参考以下博客:
[1] https://www.django.cn/article/show-4.html#yangsi
[2]