1. 引言
在当前社会中存在由于场景、送礼对象的喜好性格等各方面的因素的不同造成送礼人不能挑选到一份合乎收礼人心意的礼物,甚至有时因为场合不对造成送礼的尴尬和矛盾。目前市场上有一些针对于此问题的软件,但这些软件在功能方面较单一;在礼物推荐方面仅通过输入关键词查找推荐的方式,操作复杂,且搜索到收礼人满意的礼物商品的准确率低。因此开发一款智能、功能全面、推荐礼物与用户匹配准确率高的礼物推荐应用非常必要。
就目前来看,针对礼物推荐的研究很少。吴帅军 [1] 等人使用基于用户习惯偏好相似度的Slope One算法(UPS Slope One)、基于协同过滤的个性化推荐开发出“知礼”平台。但在获取用户信息方面,其使用用户答题的方式,获取信息较单一且操作较麻烦。市场上现存的礼物推荐软件例如礼物说,均为分类和关键词搜索的方式进行礼物推荐,匹配到用户满意的礼物的概率低。但电商的发展促进了对商品推荐的研究。焦琛皓 [2] 采用门控循环神经网络(GRU)模型来对用户购买的商品序列学习,之后又采用基于流行度的负采样来改善模型效果。此外他还使用因子分解机算法与GRU共用相同的输入,并行的生成购买物品概率的预测,最后将FM与RNN结合生成最终推荐结果。常昊和杨盛泉 [3] 将传统的协同过滤算法和决策树算法进行结合,对结合的算法改进,最终创建协同过滤决策树算法来进行商品推荐,得到的实验结果较传统的算法,准确率得到了提升。但以上研究仍存在三个问题:一用户数据获取较复杂;二礼物与用户的性格等特征的紧密度比普通商品的大,不能采用普通商品的推荐算法;三商品的被推荐者一般不为商品的使用者(即送礼人一般不为收礼人)。
因此为了解决更加准确地推荐出各种礼物的问题,本文采用Flask和SpringBoot相结合的后台开发,再利用mysql数据库、网络爬虫、jieba分词等技术,设计了基于用户性格分析的礼物商品推荐算法,开发出了具有查询浏览礼物商品、发布查看礼物帖子、浏览收藏关注DIY礼物教程、精致礼物推荐美文、用户性格分析智能推荐礼物、好友生日提醒以及用户所有信息查看功能的智能礼物推荐系统。
2. 总体设计
结合功能需求,系统设计了五大功能模块,分别是首页礼物帖子资讯、礼物寓意故事文章、基于用户性格分析的推荐量身定制的礼物、DIY礼物视频文章教程、我的(包括一些重要纪念日提醒与收藏等)。这些功能几乎涵盖了用户对于礼物挑选的所有需求,系统总体功能设计如图1所示。

Figure 1. Overall system function diagram
图1. 系统总体功能图
3. SpringBoot和Flask相结合的后台设计
3.1. 后台框架设计
3.1.1. 基于SpringBoot的后台框架设计
结合系统功能,设计出SpringBoot后台框架用于实现除了基于用户性格分析的智能礼物推荐之外的功能,为系统提供了稳定、易用的数据交互接口。SpringBoot [4] 是Java平台上的一种开源应用框架,用来简化新Spring应用的初始搭建以及开发过程。SpringBoot框架中有两个重要的策略:开箱即用和约定优于配置。开箱即用是指开发人员在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,之后使用对应注解来代替原来繁琐的XML配置文件来管理对象的生命周期。约定优于配是一种由SpringBoot本身来配置目标结构。本文采用的SpringBoot架构设计如图2所示。

Figure 2. SpringBoot background framework design
图2. SpringBoot后台框架设计图
3.1.2. 基于Flask的个性化功能实现
系统在实现基于用户性格分析的推荐商品功能时引用Python中的库开发较为便捷,因而单独设计了基于Python语言的Flask后台框架。Flask [5] 是python语言编写的轻量级web应用框架。相较其他框架,它更为灵活、轻便、安全且容易上手,可以很好地结合MVC模式进行开发。此外,Flask框架拥有强大的插件库可以让用户实现个性化的网站定制,从而开发出功能强大的网站。
结合具体的智能推荐功能设计,得到系统Flask后台架构设计图图3。

Figure 3. System Flask background framework design
图3. 系统Flask后台框架构设计图
1) 小程序端有如下三个作用:
a) 调用微信同声传译插件,实现语音转文本功能。
b) 将转化成的文本发送到后台。
c) 接受和展示商品信息。
2) 后台端有如下四个作用:
a) 调用jieba分词库对接受到的文本分词。
b) 从购物网站上爬取商品信息并存储到数据库中。
c) 计算出收礼人对应的消费性格。
d) 取出数据库中的商品信息。
3) 数据库:以表的形式存储礼物商品信息和商品对应的性格种类信息。
3.2. 用户性格分析算法
3.2.1. 相关介绍
1) 消费者性格
每个人拥有不同的性格,不同的性格产生不同的消费性格。公认的成熟的、关于消费性格的论述 [6],按照消费态度的不同,将消费性格分为经济型、自由型、保守型、顺应型、怪僻型5种类型。根据现有的论述把各种消费性格类型及其表现进行总结,如表1所示。

Table 1. Consumer character and its external performance
表1. 消费性格及其外在表现
2) 大五人格(The Big Five)
大五人格 [7] 是一种人格五因模式。强调了人格模型中每一维度的广泛性。这五个维度因素分别是神经质(N)、外倾性(E)、经验开放性(O)、宜人性(A)和认真性(C)。现在这种模式也被用于测试人们的性格。和其他的模式体系一样,该模式也是使用分值式的对人物性格进行评估,分为高分者和低分者这两个极端。为了区别表现人物的性格,本文取高分者表示该分词可评估的性格。将大五人格对应的高分者特征与消费者性格 [7] 对应的消费态度比较,可得出人格因素对应的消费性格,具体见表2。

Table 2. Personality factors, characteristics of high scorers and corresponding consumer personality
表2. 人格因素、高分者特征及对应消费者性格
3) SC-LIWC词典
SC-LIWC是一本中文分词词典,用于分析文本的性格。它是由台湾大学的黄金兰等人将LIWC进行转化而产生的。LIWC是Striman和Pennebaker联合设计完成的对英文的文本分析得到作者性格的词典。黄金兰等人说明了SC-LIWC词典中含有的7444个词项 [8] 的每一项所具有的功能情况。
3.2.2. 用户性格计算
将语音传入的收礼人的信息文本的分词集保存,分别找出每一个分词对应SC-LIWC词典中的词功能。通过SC-LIWC词典中词功能与五大类性格对应的关系,得出该分词的每个词对应的关系值。由于每个分词含有多个词功能,为能够整体的表示某一性格,取每个关系值的平均值。
(1)
其中,vi表示词v中第i个性格元素;n表示词v具有n个词功能。Pji表示第j个词功能中与第i个性格因素之间的关系值。利用以上公式求出每个词与每类性格的关系值。之后将所有分词对应的关系值相加,取出关系值最大对应的性格作为该收礼人的性格,实现逻辑图如图4所示。

Figure 4. User personality calculation logic diagram
图4. 用户性格计算实现逻辑图
4. 微信小程序前端设计
4.1. 卡片式布局设计
卡片是包含了图片和文字的小矩形模块,它是设计持续用户体验最灵活的布局之一。卡片将内容划分成多个有意义的部分,节省了一定的屏幕空间。基于卡片的设计通常主要依靠视觉设计,而使用大量图片就是卡片设计的一大亮点。因为图片可以快速有效地吸引用户的注意力。所以,加入图片也使得基于卡片的设计更加引人入胜。卡片以信息流形式呈现,制造了一条自然的事件时间轴。卡片式布局在本文中主要体现在以下三点:
1) 帖子,教程视频和文章以卡片布局呈现。
2) 礼物故事以左右滑动卡片展示。
3) 我的模块以卡片的形式展示更多的用户信息。
卡片布局在本文的实现效果如图5至图7所示。
4.2. 瀑布流式布局设计
瀑布流是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。因此瀑布流具有吸引力,不完整的视觉图片去吸引用户的好奇心,让用户停不下来想要不断的向下探索,实现的过程如图8所示。而瀑布流布局在文本中的实现结果如图9所示。

Figure 8. Waterfall flow implementation process diagram
图8. 瀑布流实现过程图

Figure 9. The effect of waterfall flow
图9. 瀑布流实现效果图
5. 关键技术
5.1. 基于同声传译的语音转文本
同声传译插件是一个同传开放接口,由微信智聆语音团队、微信翻译团队与公众平台联合推出,为开发者提供语音转文字、文本翻译、语音合成接口的服务。系统采用其语音转文字的功能,在便捷用户的同时可获取大量的收礼人描述信息。本文使用同声传译插件的步骤如下:
Step1:添加插件,登录微信公众平台官网,依次找到设置、第三方服务、添加插件,然后搜索微信同声传译并添加。
Step2:在需要使用该插件的小程序app.json文件中编写使用的插件版本、AppID等信息。引入代码如下:
plugins: {
WechatSI: {
version: 0.2.2,
provider: wx069ba97219f66d99 } }
Step3:在小程序index.js文件中引入,获取全局唯一的语音识别管理器recordRecoManager。获取js代码如下:
let manager = plugin.getRecordRecognitionManager()
Step4:在小程序index.xml文件中编写视图,xml代码如下:
5.2. 基于jieba库的中文分词
Jieba库是中文分词第三方库,支持三种分词模式即精确模式、全模式和搜索引擎模式,支持繁体分词和自定义词典。本文采用jieba库对获取的收礼人信息文本进行分词,使用Pycharm工具软件编写python程序引用jieba库,具体步骤如下:
1) 安装jieba库
在cmd命令行下输入命令:pip install jieba;回车。
2) 引入jieba库
在python程序中编写:import jieba。
jieba分词的实现原理是基于前缀词典及动态规划。算法的实现流程如图10所示,实现需三步:
Step1:构建前缀词典:基于统计词典构造前缀词典,统计词典有三列依次是词、词频和词性。
Step2:构建有向无环图:根据前缀词典对输入文本进行切分。对每个字,构建一个以位置为key,相应划分的末尾位置构成的列表为value的映射。
Step3:最大概率路径计算:将所有可能的切分方式构成有向无环图。图中从起点到终点存在多条路径即存在多种分词结果。采用从后往前的方式,利用动态规划算法计算最大概率路径。
5.3. 数据获取与存储
5.3.1. 视频、图片和文本数据获取与存储
系统的功能实现需要存储大量的视频、图片和文本数据,这些数据来源于两个方面:
a) 用户编辑、拍摄、上传
b) 后台管理员上传。系统将用户上传的数据存入数据库,用于后台从数据库中取出显示给用户。

Figure 10. jieba word segmentation flow chart
图10. jieba分词实现流程图
1) 用户数据获取与存储
用户上传的数据分为两类,即视频和图片与文本。用户在发帖功能中上传这些数据,之后按不同的方式存储。视频和图片存储在小程序提供的云服务器上,再将其在云服务器上的地址存储在mysql数据库中,以便于取出。文本占用空间较小在传到系统后台后被存储mysql数据库中。详细的数据获取与存储过程如图11所示。

Figure 11. User data acquisition and access process diagram
图11. 用户数据获取和存取过程图
2) 管理员数据获取与存储
管理员可在后台上传数据,其获取视频、图片和文本数据的方式分为两种即从网络上直接获取和自己录制、拍摄和编辑数据。对于数据的存储方式与用户上传的数据存储方式相同。视频和图片存储在云服务器,其地址链接存储在mysql数据库中,文本直接存储在mysql数据库中。之后将mysql中的数据传到系统前端展示给用户,详细的数据获取与存储过程如图12所示。
5.3.2. 商品数据获取与存储
本系统商品数据获取技术基于Python语言开发,主要引用相关的数据爬取库Beautiful Soup等,用于爬取购物网站上的商品信息。实现过程图如图13,数据爬取的思路设计如下:
Step1:引用requests库调用get()方法获取要爬取信息的网页的html。
Step2:引用Beautiful Soup库,调用其中的方法解析html,获得数据。
Step3:引用MySQL库,连接数据库,将获取的数据存入数据库中。

Figure 12. Diagram of the process of administrator data acquisition and access
图12. 管理员数据获取和存取过程图

Figure 13. Product data acquisition and storage process diagram
图13. 商品数据获取与存储过程图
6. 项目实现
根据上述总体设计和关键技术实现逻辑,完成系统全部代码的编写。将编写的两个后台部署在Linux服务器上运行,再将微信小程序上传。通过测试该系统实现了系统需求的基本功能。即用户可以通过输入对于收礼人信息的语音描述得到经过对收礼人性格分析而推荐的礼物商品、在首页浏览热门礼物帖子、发布帖子、查看DIY礼物教程和精美礼物帖子等功能。具体实现效果如图14至图16所示。
7. 总结
系统以满足用户挑选礼物的各种需求为开发目的,将运用编写的基于用户性格的礼物推荐算法实现的智能礼物推荐功能作为亮点,并设计开发了通过关键字和分类搜索礼物、查看DIY礼物教程以及查看礼物精美帖子这些功能帮助用户挑选到满意的礼物,此外辅以用户发布礼物帖、好友生日提醒等功能,为用户解决了在礼物挑选面临的难题。