主流推荐引擎技术及优缺点分析
文章作者:苏雷什·库马尔·戈拉卡拉
编辑整理:Hoh
内容来源:《自己动手做推荐引擎》
导读: 在本文中,将详细介绍多种类型的推荐系统,具体介绍基于近邻算法的推荐引擎、个性化推荐引擎、基于模型的推荐系统和混合推荐引擎等,并分析介绍每种推荐系统的优缺点。
主要介绍的不同类型的推荐系统包括:
- 近邻算法推荐引擎:基于用户的协同过滤和基于项目的协同过滤;
- 个性化推荐引擎:基于内容的推荐引擎和情境感知推荐引擎;
- 基于模型的推荐引擎:基于机器学习的推荐引擎、分类模型-SVM/KNN、矩阵分解、奇异值分解、交替最小二乘法概述、混合推荐引擎。
01 推荐引擎的发展
最近几年,推荐系统发展迅猛。从简单的近邻算法到个性化推荐再到情境感知推荐,从批处理推荐到实时推荐,从启发式的相似度计算到更准确、更复杂的机器学习方法的应用。
在推荐系统发展的早期阶段,生成推荐时只能基于用户对产品的评级。在这段时期,研究人员只能使用现有的评级数据,使用简单的启发式方法,例如:在计算相似度时,常采用诸如欧氏距离、皮尔逊系数、余弦相似度等。这些计算方法虽然简单,但是在相似度上的判断,却有非常好的表现,目前仍是一些推荐引擎比较常用的方法。
第一代推荐引擎可以称为协同过滤或近邻算法推荐。这些推荐算法虽然简单易用,在数据上也有不错的表现,但是也有它们自身的弱点和局限性,比如对已有数据过于依赖造成的冷启动问题,即它们无法实现向新用户 ( 指未对商品等进行过任何评价的用户 ) 进行商品推荐,也无法向用户推荐没有评级的新商品。当用户对产品的评级很少时,这些推荐系统无法处理这类数据十分稀疏的情形。
为了克服这些限制,一些新的方法被挖掘出来。例如,在处理大量用户评价与处理数据稀疏性问题上,通常采用数学方法 ( 如矩阵分解和奇异值分解等 )。
为了应对冷启动问题,也有新的方法出现,比如基于内容的推荐系统。这些推荐系统的出现扩大了视野,注入了新的思路,比如个性化推荐系统,它能够向每位用户独立推荐产品。在这种方法中,依赖的数据不再是评级信息,而考虑用户个人喜好和产品特征,如下图所示。
在推荐系统发展初期,相似度计算被用于基于内容的推荐系统,随着技术发展和硬件设备的不断强化升级,更为先进的方法逐步被实现出来,机器学习中更为复杂的模型渐渐取代传统的启发式方法。机器学习模型提高了推荐信息的准确性。
虽然基于内容的推荐系统解决了很多协同过滤中的缺点,但其自身也有固有的缺点,比如新发现,换句话说,就是不能在用户的偏好范围之外进行新项目的推荐。但这个问题协同过滤却可以解决。
为了解决这个问题,研究人员开始尝试将不同的推荐模型混合进行使用,之后提出了混合推荐模型。这种模型比任一单个模型都更加强大。
随着个性化推荐引擎的成功实现,人们开始将个性化扩展到其他的维度,称之为情境,例如添加位置、时间、分组信息等,这些信息改变了生成推荐信息的基础数据集。
随着技术进步,如大数据生态系统、内存分析工具 ( 如 Apache Spark ) 和实时推荐处理这些技术的发展,使处理大数据集成为可能。
目前,推荐系统越来越趋向个性化方面,例如时间维度和无处不在的推荐方式。
在技术方面,正在从机器学习向更先进的神经网络深度学习方法进行扩展。
02 基于近邻算法的推荐引擎
顾名思义,基于近邻算法的推荐系统认为相同或相似用户的喜好相近,使用这种方式对活跃用户进行推荐。这种基于近邻算法的推荐思想设定是非常简单的:根据某一个给定的用户评级,寻找所有相似用户的历史喜好信息,根据这些活跃用户的历史信息对所有未知产品做出预测,对没有评级过该商品的用户根据近邻原则进行推荐猜测,如下图所示。
同时考虑到邻居的喜好或品味,我们先计算一下活跃用户与其他用户的相似程度,然后再向该活跃用户进行未评级项目的推荐。这里的活跃用户指的是正在使用推荐系统提供的服务的用户。由于涉及相似度计算,这些推荐系统也被称为基于相似度的推荐系统。同时,由于偏好或品味都被考虑在内,这些推荐系统也被称为协同过滤推荐系统。在这些类型的系统中,主要元素是用户、产品和用户的偏好信息,如评级、排名、对产品的喜好。
下图是来自亚马逊近邻推荐算法的展示。
这些基于启发的方法是基于以下假设:
- 在过去有相似偏好的人在未来也有相似的偏好
- 人们的偏好在未来的时间里将保持稳定和一致
协同过滤系统 ( 如上图所示 ) 有两种类型:
- 基于用户的协同过滤
- 基于项目的协同过滤
近邻算法只有当有用户的商品交互信息时才能工作,比如评级、喜欢/不喜欢、看过/没看过等。与基于内容的推荐不同,它不考虑任何产品特征或用户对产品的个人偏好信息。
1. 基于用户的协同过滤
如前所述,基于用户的协同过滤系统的基本判断思想是过去具有相似口味的人,在将来也会喜欢类似的物品。例如,如果用户 A 和用户 B 有非常相似的购物历史,当用户 A 购买了一本用户 B 还没有看过的新书,就可以将这本新书推荐给用户 B,因为他们有相似的品味。
举个例子以便我们理解基于用户的协同过滤:
问题陈述:现有用户对电影网站中电影作品的评级数据集。任务是向这些用户推荐电影,数据集如下表所示:
在学习使用推荐方法前,我们首先要做的是:理解和分析现有的数据。现在我们按照如下步骤来分析:
- 一个与该应用有过互动的用户集合
- 一个所有可用电影的目录
- 每位用户对电影的评级
不是所有的用户对所有电影都进行了评级,但是未评级的电影作品只占少数。
第一步是为活跃用户找到相似的用户,然后向活跃用户推荐其还没有看过但是与其相似用户已经看过的电影。
可以归纳成两步:
- 利用电影评级信息计算用户之间的相似度。
- 对于每一个活跃用户,将所有其未评级但其他用户已评级电影考虑在内。为该活跃用户预测未评级电影的评级。
根据上面表格的数据,尝试为活跃用户 Jack Mathews 推荐新电影:
- 第一步寻找与 Jack Mathews 相似的用户。通过观察数据集发现 Gene Seymour 和 Mick LaSalle 与 Jack Mathews 相似度较高。
- 用户之间的相似度可以通过用户给定的电影评级进行计算。计算相似度最常用的方法有欧氏距离与皮尔逊相关系数。
- 在此处可以采用欧氏距离来计算用户相似度。利用如下公式:
将用户、电影和评级的数据映射到坐标轴上,用户作为 x 轴,电影作为 y 轴,评级作为向量空间中的点。现在我们已经把数据投影到向量空间,两个点之间的相似度或紧密度可以用欧氏距离和皮尔逊相关系数来计算。
使用前面的公式,我们可以计算表中所有用户之间的相似度,如上表所示。通过观察该表,我们可以发现活跃用户 Toby 与 Lisa Rose 最为相似。
第二步,我们通过其他用户对《Just My Luck》给出的评级,通过加权平均方法计算,预测 Jack 对未评级电影《Just My Luck》的评级,方法如下:
(3×0.9285 + 1.5×0.944+3×0.755 + 2×0.327)÷(0.8934051 + 0.3812464 + 0.9912407 + 0.9244735) = 2.23
在上面的等式中,将其他用户对《Just My Luck》的评级与他们与 Jack 的相似度乘积求和。然后将这个乘积之和除以所有相似度之和以得到最后的评级。同样的方法,我们可以为其他用户推荐他们未评级过的电影。
2. 基于项目的协同过滤
基于项目的协同过滤推荐系统与基于用户的协同过滤不同,它使用项目之间的相似度而不是用户之间的相似度。基于项目的推荐系统的基本思想是,如果用户的历史数据中显示过对项目 A 喜欢,如果项目 B 与项目 A 相似,那么该用户可能也喜欢项目 B,如下图所示。
基于用户的协同过滤有几个缺点:
- 在现实生活中用户的评级数据通常非常稀疏,用户在一个数据庞大的分类中只会有非常少量的评级数据,这会对系统造成很大的影响。
- 当数据量非常庞大时,计算所有用户的相似度值的成本是非常高昂的。
当用户画像或用户输入变化很快时,那么我们必须重新计算相似度,它的计算成本非常高昂。
基于项目的推荐引擎可以避免上述这些缺点,通过计算项目或产品之间的相似度,而不是计算用户之间的相似度,从而降低计算成本。因为项目目录不会经常发生改变,我们不需要经常重新计算相似度。
与基于用户的协同过滤方法步骤大致相同,基于项目的协同过滤步骤如下:
- 计算项目间的相似度。
- 通过利用活跃用户之前已经评级的项目,对还没有评级的项目进行预测评级。
基于项目的协同过滤最常用的相似度度量是余弦相似度。余弦相似度计算的是在向量空间中两个 n 维向量之间的相似度。由以下方程给出:
在将余弦相似度应用于推荐系统时,我们将项目列看作 n 维向量,并将两个项目之间的相似度看作它们之间的夹角。角度越小,项目越相似。
例如,在前面的数据集中,如果我们想要预测 Toby 对电影《Lady in the Water》评级,首先我们要找出与《Lady in the Water》相似的电影。使用上面的余弦方程,我们可以计算所有项目的相似度。下表显示所有电影的相似度值。
以项目为基础的相似度计算只针对共评项目。
通过观察上面表格,可以看出《You Me and Dupree》与《Lady in the Water》相似度最高 ( 0.8897565 )。
现在可以通过 Toby 对《Lady in the Water》评级计算加权总和来进行预测。也就是说,我们使用 Toby 评级过的每一部电影与《Lady in the Water》的相似度分数,乘以对应的评级,并对所有已评级电影的分数求和。这个最后的总和除以《Lady in the Water》的相似度分数总和,如下所示:
计算《Lady in the Water》的电影评级:
(0.795×4.5 + 0.814×4 + 0.889×1)÷(0.795+0.814+0.889) = 3.09
同理,通过上述的计算方式可以推算出其他用户对电影的评级。
3. 优点
- 易于实现。
- 在构建推荐时,无论是产品的内容信息,还是用户的画像信息,都不需要。
- 新项目被推荐给用户,往往会带来意想不到的惊喜。
4. 缺点
- 计算成本较高,它需要将所有的用户、产品和评级信息全部加载到内存中进行相似度计算。
- 这种方法对于没有任何用户信息的新用户会失效,无法进行推荐。这就是常说的冷启动问题。
- 在只有少量数据的情况下,这种算法的效果不理想。
- 在没有任何用户或者产品内容信息的情况下,无法只通过评级信息生成准确的推荐信息。
03基于内容的推荐系统
在上一节我们看到通过仅参考用户对产品的评级或是交互信息从而生成推荐信息,换而言之,为活跃用户推荐新项目是基于与当前用户相似的用户对该项目的评级来进行的。
回忆一下前面介绍到的电影评级数据,其中有个用户给某部电影打了 4 星,在协同过滤中,算法只需要考虑根据评级去生成推荐。而在现实世界中,真实用户之间进行推荐时会根据电影特点或者内容来评级,比如电影的类型、演员、导演、故事情节和剧本。真实用户会根据个人喜好有选择性地进行观看。根据这些现实情况,想要达到最大化实现商业目的,在构建推荐引擎时,需要通过考虑如何根据个人的品味和产品内容来进行推荐,而不是单纯地将目标设定在寻找相似用户的品味以进行推荐。
这种针对用户自身偏好和产品内容的推荐,称之为基于内容的推荐系统,如下图所示。
构建基于内容的推荐引擎的另一个目的是想要解决协同过滤方法中新用户面临的冷启动问题。当一个新用户登录时,可以根据个人的品味,进行新项目的推荐。
构建基于内容的推荐系统,主要有以下三个步骤:
- 生成产品的内容信息。
- 根据产品的特征生成用户画像和偏好项。
- 生成推荐信息,预测用户偏好的项目列表。
**项目画像生成:**该步主要将产品根据产品特征进行抽象描述。最常见是将产品内容表示在向量空间模型中,将产品名称作为行,特征作为列。通常产品内容可能是结构化数据,也可能是非结构化数据。结构化数据会存储到数据库中,非结构化的特征可能包含网站中相关的评论、标签或者是文本属性。在本步骤中,需要提取相关的特征以及它们与产品相关的相对重要性分值。
对项目进行画像生成时可以使用词频—逆文档频率 ( 简称 TF—IDF ),它可以计算出项目相关的较为重要特征。由于该推荐系统需要将项目的特征使用向量进行表示,所以可以使用 TF—IDF。
举个例子以方便大家更好地理解这种思想。上面提到基于内容的推荐引擎需要更多关于电影内容的信息,如下表所示。
首先我们要做的是使用 TF—IDF 创建项目画像。详细步骤如下:
创建一个特征词频矩阵,它通常包含对每个文档中每个特征词的详细统计,引入到本例中,可以理解成每部电影是否属于某一类型。数字 1 代表属于该类型,而 0 代表不属于该类型,如下表所示。
接下来通过逆文档频率 ( IDF ) 的公式计算出每个电影类型的频率。公式如下:
Idf = log ( 文档总数/文档频率 )
本例中,文档的总数是电影的总数,文档频率指的是它们在所有文档中出现的总次数,如下表所示。
最后一步是通过以下公式构建 TF—IDF 矩阵:
tf*idf
1. 用户画像生成
本步将构建匹配产品内容的用户画像或偏好矩阵。一般来说,在构建用户画像或特征时基于共同的产品内容,而通过比较用户和项目画像并计算它们之间的相似度将会更有意义。
考虑下表中的数据集,该数据集记录了每位用户的历史观影记录。单元格中为 1 表示用户观看过该部电影。这些信息清晰地说明了用户对电影的偏好。
根据前面的信息,我们将创建一个可以用来与项目画像比较的用户画像,也就是说,我们现在要构建一个用户画像,其中包含用户对项目特征 ( 这里是电影类型信息 ) 的偏好。将 TF—IDF 和用户偏好矩阵求点积,从而得到用户对每种类型电影的亲和度,如下表所示。
DotProduct(Tf-idf, userPreference matrix)
现在已经得到用户画像和项目画像,接下来可以预测用户对每个项目的喜爱程度。我们现在可以通过余弦相似度计算用户对项目的喜好。在本例中,通过计算用户画像和项目画像的余弦相似度得出以下结果。
cosineSimilarity(userProfile, ItemProfile)
从上面的表格中,我们不难发现,余弦角越大越可能是用户喜欢的电影,也就是可以向用户推荐的电影。
现在我们已经完成了推荐,让我们回头看一下如何收集用户喜好数据。通常有两种获取用户数据的方法,如下所示:
- 直接询问式,即明确地询问用户对产品特征的喜好,并进行存储。
- 隐式获取,即在后台收集用户与产品的交互数据,如浏览历史、评级历史和购买历史,并生成用户对产品特征的喜好。
到目前为止介绍的基于内容的推荐引擎,都是基于相似度计算。当然并不是只有相似度算法,也可以使用有监督的机器学习方法,如分类也可以用在推测用户最有可能喜欢的产品上。
使用机器学习或其他数学模型、统计模型生成推荐信息的推荐系统称为基于模型的推荐系统。基于分类的方法属于基于模型的推荐系统,首先使用用户画像和项目画像构建机器学习模型来预测用户对项目是否喜欢。有监督分类常用的有:逻辑回归、KNN 分类、概率方法等。基于模型的推荐引擎将在下一节中讨论。
2. 优点
- 基于内容的推荐系统以实现个性化推荐为目标。
- 推荐信息是基于个人的喜好来进行推荐,而不像协同过滤需要通过用户社区。
- 可以支持实时性推荐的要求,因为不需要加载所有的数据进行处理或生成推荐信息。
- 比协同过滤方法准确性更高,因为它处理了产品内容,而不是只基于评级信息。
- 能处理冷启动问题。
3. 缺点
- 随着推荐系统更加个性化,当加入更多用户信息时,只能生成用户小范围的喜好信息推荐。
- 上述问题将会导致用户信息闭塞,新产品无法推送给用户。
- 用户敏感度降低,对其周围的信息或是趋势无法得到感知。
04 情境感知推荐系统
随着时间的推移,推荐系统一直在不断地快速发展变化,从最初的基于近邻算法的推荐引擎到针对单个用户的个性化推荐系统的出现。这些个性化推荐系统在商业上的应用取得了巨大的成功,它为用户提供了较合理的推荐信息,提高了用户的购买可能性,使企业获得更多利益。
尽管个性化推荐系统定位在单个用户级别,推荐的信息是根据个人喜好得出,但仍然有可以改进的地方。比如,同一个人在不同的地方可能有不同的需求。又或者,同一个人在不同的时间也会有不同的需求。如下图所示。
我们的推荐引擎需要足够智能,它需要进化到能够满足用户在不同时间、不同地点的需求。比如冬天推荐用户购买皮夹克,夏天推荐人们购买衬衫。又或是,根据一天的不同时段,为用户推荐好的餐厅进行早餐或者晚餐,这样的推荐信息对于用户来说是非常有帮助的。这种可以考虑到位置、时间、情绪等相关因素,定义用户的情境并进行推荐的系统,被称为情境感知推荐系统,如下图所示。
上图展示了一个在寒冷的天气向用户推荐热咖啡的推荐引擎。
1. 情境定义
那么到底什么是情境呢?一般来说,情境指的是用户所处的当前状态。用户的情境可以是用户所处的任何状态,比如地点、时间、日期、季节、心情、计划、用户是否一个人、是在办公室、在度假、与家人或朋友在一起、是否面临人生大事等。正是因为用户在不同的情境下会有不同的需求,所以推荐系统可以捕捉用户的情境信息,从而为用户提供更为有效的推荐。
例如,旅游度假推荐引擎可以考虑把季节、地点和时间作为情境以改善推荐。又或者在电子商务网站的推荐引擎中,可以把用户是否面临人生大事和用户的购买行为考虑为推荐情境。又或是一个食品网站推荐引擎可以考虑用餐时间、地点等信息。
情境感知推荐系统需要如何设计?到现在为止,书中已经介绍的推荐引擎最多是在二维空间中建模,主要是基于用户的偏好和项目特征数据而进行的。而对于情境感知推荐系统来说,它在建模的时候加入了一个新的维度,即分析用户的情境。使推荐引擎从解决二维问题扩展到三维问题,如下图所示。
Recommendations = User x Item x Context
回顾一下基于内容的推荐系统中涉及的例子。基于内容的推荐引擎考虑用户画像和项目画像,通过计算用户画像和项目画像的相似度并基于用户偏好以为每个项目生成用户评级。而在情境感知推荐系统中,需要考虑加入情境,对应用户偏好和情境生成项目排序。
举例说明,假设推荐系统已经收集到用户在不同时间观影的历史数据,类型包括 weekday、weekend 和 Holiday。通过该情境信息,可以分析出每位用户与电影内容之间的关系。如下表所示,表中数据显示用户 TOBY 在以观影时间类型为情境的前提下,会对哪种电影内容比较感兴趣。
通过对用户数据的分析,参考所有的电影内容类型,可以为用户 TOBY 构建一个基于内容情境的用户画像。
将得到情境矩阵和用户画像矩阵求点积,从而得出关于所有情境的用户画像,如下表所示。
Dotproduct(user profile, context matrix) for TOBY:
现在计算得到了 TOBY 关于电影内容的各个情境的偏好。下一步是计算 TOBY 在全部情境中对每部电影的排序,如下表所示。
Cosine similarity (contextual movie content preference matrix, item profile):
现在得到了 TOBY 的情境级电影排序,可以在此基础上进行电影推荐了。
从上面的例子中,不难看出现在接触到的这种情境感知推荐系统,其实是在基于内容的推荐系统的基础上加入了一个新的维度,即情境。情境感知系统在生成推荐信息时,主要过程分为两步,如下所述:
- 根据用户的喜好,为每位用户生成产品推荐列表,也就是基于内容的推荐。
- 根据特定的情境,筛选出推荐信息。
常用的构建情境感知系统的方法如下:
- 前置过滤法
- 后置过滤法
2. 前置过滤法
在前置过滤法中,情境信息会被应用到用户画像和产品内容上。这一步会过滤掉所有非相关的特征,最终的个性化推荐会通过剩余的特征集生成。因为特征过滤是在生成个性化推荐之前进行的,所以称这种方法为前置过滤法。如下图所示。
3. 后置过滤法
在后置过滤法中,首先会基于用户画像和产品特征生成个性化推荐,之后再根据当前情境过滤出相关产品。如下图所示。
4. 优点
- 情境感知系统在进行推荐时加入了情境,这种推荐引擎参考了用户的动态并不断地同步更新用户数据,所以由它生成的推荐信息更能贴近用户的真实需求,与个性化的基于内容的推荐系统相比,情境感知系统在推荐信息上更具有先进性。
- 情境感知系统具有更强的实时性。
5. 缺点
- 与其他的个性化推荐系统一样,额外的亮点因素也会在这类推荐系统中缺失。
05混合推荐系统
协同过滤推荐系统与基于内容的推荐系统都很有效,适用范围也很广。它们都有很成功的实现,但也有各自的局限性。目前的研究已经开始朝着如何结合协同过滤和基于内容的推荐的方向发展。将这两种推荐系统相结合,产生的新型推荐系统,被称之为混合推荐系统。
如何选择要混合的推荐系统呢?这要根据需要解决什么类型的现实问题或是基于什么样的业务需求考虑,当然还要取决于一个经验丰富的开发人员对问题的判断。
构建混合推荐系统最常见的方法有:加权法、混合法、变换法、层叠法、特征组合法、特征扩充法、元级别 ( Meta-level )。
1. 加权法
在这种方法中,最终的推荐将是所有可用的推荐引擎的推荐结果的组合,通常是线性的。在部署这种加权混合推荐引擎之初,对各个推荐引擎的结果赋予的权重是相等的,然后通过评估用户对推荐的响应,逐渐调整权重。
2. 混合法
当可以混合所有可用的推荐引擎的有效推荐结果时,就可以应用混合法。这种方法主要应用在因为数据稀疏导致不能通过所有可用的推荐系统获得产品评分的情况。因此在采用这种方式生成推荐信息时,推荐是独立生成的,并在发送给用户之前先进行混合。
3. 层叠法
在这种方法中,推荐信息通常采用协同过滤的方式生成。之后应用基于内容的推荐技术,将最终的推荐信息或排序列表进行输出。
4. 特征组合法
特征组合法组合不同推荐系统的特征并将最终推荐方法应用于组合的特征集。在这种技术中,我们组合来自基于内容的推荐系统的用户—项目偏好特征和用户—项目评级信息,并考虑一个新的策略来构建混合推荐系统 ( 如下图所示 )。
5. 优点
- 混合推荐系统可以处理冷启动问题和数据稀疏问题。
- 混合推荐系统的健壮性和可扩展性比任何单独的推荐模型要好很多。
- 混合推荐系统将各种方法进行组合,使推荐的准确率得到了提高。
06 基于模型的推荐系统
到目前为止,我们都专注于用于协同过滤方法的包含用户或产品之间相似度计算的近邻方法,或是将用户和项目内容在一个向量空间模型表示,并寻找相似度度量以识别相似于用户偏好的项目。基于相似度的方法的主要目标是计算出产品或者产品内容的用户偏好权重,然后使用这些特征权重来推荐项目。
这些方法一直很成功,但它们也有自身的局限性。因为相似度计算时,所有的数据都必须加载到环境中,这些方法也被称为基于内存的模型。这些基于内存的模型当数据量非常大时在实时场景中响应速度非常慢,因为所有数据
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E4%B8%BB%E6%B5%81%E6%8E%A8%E8%8D%90%E5%BC%95%E6%93%8E%E6%8A%80%E6%9C%AF%E5%8F%8A%E4%BC%98%E7%BC%BA%E7%82%B9%E5%88%86%E6%9E%90/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com