这个项目是我在使用QQ阅读时而自然而然的产生的想法,它源于QQ阅读目前的主流推荐方式的不足:(1)基于阅读历史记录的Top-N推荐;(2)基于标签选择的相似内容推荐。前者给我的推荐无法让我眼前一亮,后者的自定义标签组合太少,往往在我给出一种组合后,还需要翻阅半天才能找到一个比较有意思的小说(很多时候甚至无法找到),这启示着我,其实目前的小说推荐算法并不完备,它没有赋予用户更多的自定义推荐内容的自由度。
基于此,我参考目前很多的语义推荐系统,提出了一种结合语义分析的小说推荐。用户可以自定义自己想看或者不想看的内容,在文本框中进行输入,服务器会对用户的语义进行粗分析,并从数据库中召回大量相关小说。之后再对语义进行精准匹配,并对找回小说进行精排,精排结果以Top-N的形式展示给用户。
项目搭建完成并测试通过后,希望可以提供给大家一个免费的小说精确查找途径,供大家自由组合自己想看的内容,解决书荒
该项目的工期安排将分为三阶段进行:
1、前期准备:
2、本地实现:
例如:“玄幻”就是最粗的分类关键词,而“加藤惠”就是最精的标签关键词
3、项目上云:
NLP技术目前考虑利用两类方法,分别是NLP情感分析——用于提取用户的喜欢与不喜欢语句,建立用户偏好集合,以及NLP文本提取——用于提取关键词,完善用户偏好向量,其中NLP文本提取提取出的关键词,必须包含该关键词的粗精程度,以方便推荐算法的工作。
参考文献:
[1] 文本情感分析方法研究综述 杨婷
[2] https://blog.csdn.net/weixin_42398658/article/details/85222547
[3] 基于权值算法的中文情感分析系统研究与实现
[4] Chinese Text Sentiment Analysis Based on Extended Sentiment Dictionary
情感分析目前有三类方法:
1、基于情感词典的情感分析
2、基于机器学习的情感分析(分类问题)
3、基于深度学习的情感分析
可以用下图来表示情感分析目前的研究现状(来自[1]):
基于情感词典的情感分析,就是对文本中出现的情感词进行加权匹配,并判断它的情感倾向;基于机器学习的情感分析,就是利用训练数据训练出一个分类器做分类;基于深度学习的情感分析,采用了循环神经网络联系上下文,本质也是做分类,但精准度要高于机器学习。
在本项目中,我们想实现的是对录入语句表达的是喜欢还是讨厌进行区分,区分后的句子作为输出送到文本提取阶段,进行关键词的提取。因此,该任务可以总结为:
输入:一段语句
输出:喜欢句:list 讨厌句:list 中性句:list
键入需求与评价是不相同的问题,用户在键入需求时,很少会将模棱两可的想法作为描述输入,而更多的是指向性的描述,例如:
喜欢:我想看主角是萧炎的同人小说,女主角最好是云韵
不喜欢:我不想要女主角是萧熏儿
当然,其实用户的思考方式是多样的,也可能存在用户想通过疑问句的方式来进行输入,例如:
疑问:有没有一本书,它的主角是萧炎,女主是云韵
对于这类没有一个情感词的,我们将全句处理为中性偏好,录入用户喜好集合
而做评价时,会出现很多模棱两可、中性、乃至反讽的描述,表明该用户的无倾向性
模棱两可:我看过这个电影后,感觉电影好也不好
中性:这电影一般
反讽:这电影能好看?
而目前开源的情感分析语料库中,大多数都是微博评论、商品评论、电影评论等等,电影评论的语料库虽不是不能用,但也感觉不太对口,或者杀鸡用牛刀。
由于键入需求时,一般都带着比较明确的情感倾向词,所以在情感分析部分,我们推荐使 用第一类方法即可达到比较好的分类效果。在第一类方法效果不好之后,再考虑转机器学习和深度学习方法,通过语料库训练出一个分类器。
使用第一类方法需要的资源列表:
语气强烈(喜欢):女主一定要是云韵
语气一般(喜欢):男主可以是萧炎
语气无参考:没啥其他要求
语气一般讨厌:希望女二不是萧熏儿
语气非常讨厌:剧情一定不要虐主
我们就获得了五个程度的语句,每一个程度提取出的关键词,将为之后的相似度计算提供不同的权重(有正负之分)。
[1] https://blog.csdn.net/kevin_darkelf/article/details/109995102
[2] https://blog.csdn.net/weixin_37641832/article/details/104195687
其实,本文要实现的文本提取,也就是命名体识别,目前的中文分词包jieba已经可以满足需要(至少比自己训练出来的更好),现总结一下在本项目中会使用到的jieba功能,以及输入输出(顺带一提,清华和哈工大这些研究室真的牛,做出的这些开源库)
首先是自定义词典的导入
自定义词典是为了适应轻小说推荐的场所,将轻小说常出现的同人书籍、同人动漫、同人电影、同人游戏的名称以及主角名作为词典导入,这里我们从百度词库中下载了一些相关词典如下:
由于下载下来的是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),这些分词可以直接提取出来,辅助之后的关键词建立。
最后,是结构化初始关键词,建立粗精对应表
建立的粗精对应表主要集中在同人轻小说上,对于其他分类,则会更宽泛一点,粒度不会那么细,粗精对应表,额外加权手段的结构树如下图所示:
采用基于内容的推荐算法,这部分内容以后再详述
这部分知识,可以参考以下博客:
[1] https://www.django.cn/article/show-4.html#yangsi
[2] https://blog.csdn.net/weixin_45647388/article/details/110452303?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242