Quora在自然语言处理上的所做的工作
问答网站最核心的内容是提供给优质的内容,如何让内容更加优质,处理分析大量的文本数据也是必不可少的工作。Quora有大量的文本数据,分布在Quora的数百万个问题、答案和评论中。不仅如此,还有大量的元数据来补充我问答,包括”赞”和”踩”,用户对话题的兴趣或擅长与否,问题和话题的关系,话题去重合并,用户的社交和关系和影响力幅射,以及用户在Quora的每一个操作历史。如此丰富的数据集让Quora能够从一个非常特殊的视角去看待如何用自然语言处理(Natural Language Processing NLP)技术去解决一些有趣并且有用的问题。这些问题主要集中在以下方面:
- 随着内容的增长,如何维持并改进我们内容的质量
- 让内容更加结构化,从而让知识的索引更简单
- 让社区保持稳定且健康。
让优质答案优先展示
为了让读者优先看到优质的答案,Quora给答案进行了评分,评分主要基于下面几个客观维度,书写风格,可读性,完整性,可靠性。
Quroa早期对于问答的排序是按照赞成和反对票数量的简单排名函数(百分比,或者差值),称其为基准线。虽然效果还不错,但是也存在一些问题:
- 时间相关:我们在答案收到投票之前无法排名。
- 马太效应:内容一旦收获投票,则更容易收获更多的投票。
- 玩笑答案:玩笑答案往往很热门,但是不见得对问题有任何帮助。
- 可发现性:新加入Quora的专家,可能没有足够多的followers,他们的内容无法被看到,导致她们的回答永远在后面,然后他们就更难获得followers。
Quora的排序方法:
Quora定义一个好的答案要拥有如下5个特性:
- 不能答非所问。
- 给任何对这个问题感兴趣的人提供可以复用的知识。
- 答案必须符合基本原理。
- 示范必须可信,基础事实必须正确。
- 清晰,易读。
上面的截图,我们看到了一个好回答的例子。注意框选区域,他们显示了可以用在预测中的结构化信息,例如,作者的可信度,格式,赞同票,等等。Quora还有很多作者和投票者的历史数据,来推断主题专业度以及可信度。
Quora在回答排序方法中使用的是非个性化supervised item-wise regression方法。使用的是监督学习,所以需要训练数据用来抽取特征,建立模型。不管问题如何被建模,都希望可以客观的验证模型。一个方法是使用A/B测试来验证模型,观察相关的指标。这通常被叫做在线验证。另外一种方法,离线验证,指的是模拟排名,然后用它们和一些已知的好的排名比较。离线验证显著优点是可以快速的迭代型。对于答案排序,选择了任何一个模型,都可以有最佳的表现, Quora专注于离线验证,因为Quora需要做的不是短期的优化用户行为表现,而是提供更高质量的产品。
创建一个好的数据集可能成本高昂,但是对在离线情况下验证排名算法极端重要。Quora使用很多不同的方式来了解答案的真实质量。例如,曾经考虑使用一个答案列表,用赞同票和反对票的比例作为标签。这可以作为构建一个基础信任数据的一个不错的起点。这样的数据有很多,因为Quora上有成百万的答案既有赞同票也有反对票。然而,这种标签的问题跟之前反对票标签会遭遇类似的问题。它会把一些非常流行,但是低质量的答案(例如,玩笑答案)排在前面。
另外一种其他人得到训练数据的方法是进行一个用户调查。调查页面可能会问用户是否觉得某个答案有用。结合用户正在看什么答案,以及他们未来参与等级如何,来推测这个信息。所有这些方法都有它们的长处和缺点,在现实世界的设定下,可能想尝试很多种有创意的方法,然后尝试把它们都结合到一个权威的基础信任数据集。
使用从训练集抽取的一组特征训练我们的模型。特征选取就是用一组函数把我们的例子转换成数值的流程。supervised学习设定下,特征选取是一个模型成功的主要贡献者,也常常是构建一个好的机器学习系统最难的部分。Quroa用对答案质量的直觉测试了大量的特征。尝试过的:基于文本的特征,基于专业度的特征,基于作者投票者历史行为的特征。一开始使用效果明显(高ROI,高投资回报率)的基于文本的特征,但是实验了一阵子,开始尝试更复杂的概念,比如 句法复杂度(syntactic complexity)。很重要的一点,我们期望我们的特征选取做的足够的好,但是文本特征实际上经常产生问题。Quroa最后组合特征,并且如果合理的话重用其他机器学习模型的输出。一个组合模型往往比单一特征更好,常常是提到性能的强大方法。例如,有一个模型尝试去估价一个用户对指定主题的专业度,从这个模型引出的特征结果非常有效。
为了解决通用回归(general regression)问题,Quora实验了几个模型:linear regression、logistic regression、random forests、gradient boosted trees、neural networks。很多都不错,特别是gradient boosted trees以及一些深度学习(deep learning)方法,非常不错。但是,Quroa很在乎的模型可解释性——任何时候,排名看起来不对,都想知道问题出在模型、特征、训练数据、或者还是其他的原因。大家都知道模型越简单,就越好解释。例如,线性回归就是一组特征的权重,但是神经网络可能有很多层,难以解释和可视化。而且从性能考虑,Quroa倾向于简单的模型。
问答作为一个机器学习问题一文中提到,寻找正确的度量是非常重要的。既然选择了point-wise排名方法,就需要关注很多高级度量,有一些是基于排名的,有一些是point-wise的。Quora使用如下的度量方式:
- 基于排名的:NDCG、Mean Reciprocal Rank、Spearman’s Rho, Kendall’s Tau
- point-wise:R2、Mean Squared Error
基于排名的度量给Quora关于算法的信息,同时point-wise的确保评分在尺度上接近训练数据,不同问题之间的答案也可以被比较了。
当用户在Quora加上了一个新答案,希望尽快在问题页面给这个答案排名,以提供一个平滑的用户体验。虽然预测的延时非常低,但仍旧需要为新答案计算一些耗时的特征,这种延时会损害加入答案流程的用户体验。所以,创建了一个单独的模型,仅基于那些容易计算的特征,为新加入的答案提供一个还不错的近似评分,来快速排名。一旦答案被添加后,我们会异步的计算一个更准确的评分。
在上百万个答案上实时排名是一个核心的挑战。问题页面可以包含数百个答案。想象一个系统使用数百个特征,需要上百毫秒去计算。问题页面可能需要10秒钟以上去加载。在这种情况下,答案的评分必须更快的产生,所以,把答案评分缓存起来,以便问题页面可以在合理的时间内加载完成。但是,缓存的问题是,如果任何一个特征值变了,我们就可能需要更新答案的分数。为了节约重新计算全部特征的时间,也需要保存全部的特征值。所有这些数据(答案得分、特征值),都保存在可以支撑大量的数据以及写入的HBase中。
缓存每个答案的得分带来的一个问题是,当一些问题或者用户的特征改变时,我们需要更新大量的答案。考虑一个可能有上万个答案的用户。如果依赖于特征,例如用户的答案数,那么每次他增加一个答案,我们就需要更新他全部答案的评分。答案多的用户,往往添加答案也更频繁,这就更恶化了这个问题。为了缓解这个问题的影响,需要把部分用户和问题的数据组织起来。然后,尝试批处理计算这些答案的分数,减少重复的计算。
以上一切,仍旧无法把更新量降低到一个可以控制的范围,所以,在决策树内部做了其他的优化。如果更新一个特征不会影响到答案的评分,我们就不更新它。以上全部的优化,把预测工作量降低了70%,模型在目前的规模下可以高效的运行。
总体上,模型生成的积分,比基准线准确得多。在全部的度量标准下,相比基准线提高了50%的效果,缩短了和完美排名之间的差距,排名质量看起来很不错。同时这些评分对很多基于好答案定义的应用都很有价值:
- 折叠答案。如果一个答案的积分太低,它可能是坏的内容,应该被折叠。我们现在还会在作者得到反对票之前,就提示他内容质量不够高,可能会被折叠。
- 高质量的通知。如果用户收到一个低质量答案的通知,那是一个非常坏的用户体验。
- 提高首页流的排名效果。
在这些改进的基础上,还有很多需要去做。例如,模型还不能个性化。也可以多花些精力放在用更高的技术来给回答文本建模。可以研究Recurrent Neural Networks,它可以处理词序列(早期实验结果很好)。或者,使用一个可以处理更多数据的模型。总体上,会把精力放在更复杂的自然语言处理(Natural Language Processing (NLP))方法上,帮助我们理解问题和回答的语义。
自动纠正语法
因为Quora是在世界范围内进行知识的共享和探索,因此能让不同英语水准的人都能够在Quora进行写作。通过使用NLP,可以自动改进一小段话的语法或者可读性,而不改变它的意思。
关于自动语法纠正,我没有找到更多的资料。 Grammarly:在线语法纠正和校对工具是一个可以帮助用户自动校队语法,纠正英语句子的在线工具,你可以把自己的英文文本发送到该平台上,通过他们的庞大的数据库来帮助你检测和纠正文本中的错误。
问题重复检测
看到一个问题的各种花式问法是让人很心烦的,读者必须看很多页面才能找到答案,作者必须回答一个问题很多次。Quora希望能够有唯一的,规范的提问方式。为了达到这个目标,必须能够判断一个新问题是否已经在Quora有过类似的问题了,从而检测到问题重复。由于Quora有数百万个问题,重复问题检测是一个非常困难的挑战,如果还想在用户敲问题的同时,实时给出提示,则是难上加难。
相关问题提示
在问题有了答案之后,我们经常希望找到相关的问题或者后续问题。Quora的用户也是如此——人们喜欢通过相关的问题来发现新的内容。根据一个问题,寻找在Quora上已经存在的相关问题就是又一大NLP挑战。特别是在区分相关问题和重复问题的时候难度更大,因为这两者的区分特别小。
话题的专业背景质量
许多在Quora上回答问题的人都是某个领域的专家。质量系统需要很好的理解这些作者在这些话题上的专业性和权威性,话题的专业背景就是理解时的一个重要依据。通过话题专业背景,可以使作者在同一个话题内的答案,拥有相同的质量评分。比如说,在”机器学习(Machine Learning)”话题下的专业背景就包括:
- 应用统计学博士
- 本科学历
- Quora的ML工程师
- Montreal研究院学习算法负责人
这些背景表明了不同的专业性和权威性。不过仅仅通过话题专业背景来推测专业性就是一个困难的NLP问题。不仅仅因为专业背景字数非常少,往往少于100字,而且系统必须支持各种各样差距很大的话题,比如爵士音乐和火箭工程。
User Trust/Expertise Inference 这是Quora另一件非常重要的事情,Quora需要找出某个领域的专家,然后通过产品引导这些专家在这个领域里贡献更多的优质答案。Quora会考虑用户在某个领域里回答问题的多少,接收到的顶、踩、感谢、分享、收藏及浏览等数据。另外还有一个很重要的是专业度的传播效应,比如在推荐系统领域对某个答案顶了一下,那么这个答案作者在推荐系统领域很可能具备较高的专业度。
话题标定器
Topic是对一个主题内容的聚合,Topic在Quora的信息架构里面承载着极其重要的角色,是知识结构的骨架,Quora管这个叫做Topic Network,如何构建Topic Network本身就是一个非常大的挑战,另外还需要解决的问题包括,如何把Topic下(潜在)优质的问题发掘出来,以及如何把水问题降权和过滤/合并重复问题等。
Quora的话题组成非常的复杂,大到”科学”小到”山顶的网球场”应有尽有。为了给用户展示他们想了解的话题的同时也能展示给他们一些他们专业领域内却又没有被回答过的问题。为了能做到这些,需要给问题打标签。每一个新来的问题打上一个话题库里的已有的标签。这是一个非常困难的NLP问题,因为每一个问题只有一小段文字而已。
Quora花了很大力气来正确引导用户给内容打标签,持续不断坚持这项工作的好处开始逐渐显露出来了,他们发现
- 随着用户群体的扩大,Topic正在呈现出迅速多样化的势头。
- 很多领域都自组织出了相当不错的层级知识结构。
Quora相信这种依靠社群来组织领域知识的方式是可行的。
搜索
Quora的知识库是不断的增长的,因此搜索是很重要的。把NLP技术应用在信息检索领域的目的是为了更好的理解我们用户的问题和搜索词,并给问题,答案,话题以及用户背景排序。与传统的搜索引擎不同,传统的搜索引擎只需要简单的匹配关键字,而Quroa还需要支持用很长询问句作为查询语句。
问答摘要
数百万人都会在Quora上面写篇幅很长又很有深度的答案,这很普遍。但是,有时候读者只想大概的看一下答案,而不去了解所有细节,特别是在移动设备上访问Quora的时候。NLP挑战就是如何自动生成这些答案的摘要。这些摘要必须抓住整个答案的要领。目前Quora还没有问答摘要,但是Quora觉得这会对提升我们的用户体验很有帮助。
自动生成问答维基
尽管有些读者喜欢读一篇文章下的不同答案,更多的人还是希望能快速的找到答案,然后去做别的事情。作为问答摘要的扩展,另一个NLP问题的挑战就是如何为整个问答页创建维基页。比如,能够处理和总结一个问题下面所有的答案所代表的不同视角,并且整理成一个方便阅读的格式。这比仅仅生成问答摘要还要难的多,但是Quora对解决这个问题非常感兴趣。
负面情绪检测
Quora是一个文明互助的社区,并不排斥直白,但是反对侮辱和消极的信息。使用NLP技术快速的检测到那些粗鲁低俗的语言,并且快速的除掉它们。
垃圾信息检测
Quora能帮助用户快速的发布他们的内容,同时这也意味着很多垃圾网站会利用平台发布垃圾信息来给他们的网站导流。因此垃圾信息检测是NLP工作中的一个重要应用: 无论是问题还是答案,我们都会自动识别出他们是不是垃圾信息。尽管支持个人或者公司在Quora上推广产品,但是垃圾信息和自营销是有着微妙却又十分重要的区别的。
问题编辑质量检测
在Quora,允许社区里的任何人改进一个问题的措辞。有时候用户对问题的修改会导致问题的含义发生变化,有时候甚至会有人进行恶意篡改。判断一次修改是否是对一个问题的改善,让问题更清晰或者至少不改变原意也是一个困难的NLP挑战。Quora正在解决这个问题。
将问题推荐给用户
在问题推荐上,Quora主要考虑三个因素:Relevance(关联度)、Quality(质量)和Demand(需求)。Quora核心的数据模型及其之间的关系:
Quora做推荐的一个最核心问题就是Personalized Feed Ranking。Quora是以问题、答案与主题为核心把「知识」串联起来,然后基于用户的顶和踩等动作来划分内容质量,最后再通过人和问题的Follow关系让知识在社区内流动起来。而个人Feed正是这种「流动」的最主要的载体。Quora Feed Ranking的首要目标是确保推送进用户Feed的内容应该是和用户兴趣高度相关的,其次还需要考虑的包括用户之间的Follow关系以及互动,另外还有时间因素,比如一些和热点事件相关的问答,也应该及时地推送进用户Feed。即:Present most interesting stories for a user at a given time
- Interesting = topical relevance + social relevance + timeliness
- Stories = questions + answers
Quora主要使用的是个性化的learning-to-rank方法,相比于时间排序(time-ordered),相关度排序大大提升了用户参与度。但也同时面临的挑战:
- potentially many candidate stories(太多潜在信息)
- real-time ranking(实时性)
- optimize for relevance(关联优化)
下图是Quora做Feed Ranking最最基础的数据构成,Quora管这个叫做「impression logs」。
围绕这些基础行为,Quora定义的Relevance函数如下:
简单讲就是使用一个「行为加权函数」来预测用户对一个story的感兴趣程度。有两种可选的计算方法,一种是把所有行为弄到一个回归模型里面直接预测最终值,另外一种就是先分别预测每个动作的可能性(比如顶、阅读、分享等)然后再综合起来加权求和。第一种简单,但可解释性稍差,第二种可以更好的利用每个动作信号,但需要给每个动作配一个分类器,计算消耗大。Quora主要使用的三类模型如下:
Quora最主要的特征包括:
- user (e.g. age, country, recent activity)
- story (e.g. popularity, trendiness, quality)
- interactions between the two(e.g. topic or author affinity)
从整体框架来看,Quora的Feed Ranking也没有什么太特别的地方,基本上也是业界的标准打法。Quora比较特别的是它的数据模型相对其他网站更复杂,之间的关系也更多样化。比如从用户角度看,既可以follow其他用户User,又可以follow问题Question,还可以follow主题Topic。Follow用户接收到的信息范围更广也更多样化,惊喜内容很可能就是来自于自己关注的有趣的用户,但也可能最容易制造不相关的内容噪音,这块的最重要工作是用户专业度的评估。
将用户推荐给问题
Ask2Answers是Quora产品里面非常重要的一个功能,本来Quora是可以直接把相关问题推荐给系统认为的合适的回答者的,Quora最开始也是这么做的,但系统自动做这事儿显然不如发动群众人肉邀请回答来得感觉好,Ask2Answers 操作增强了仪式感,让被邀请者有种被人需要的感觉,心理上很满足,另外这也是一种社交动作,社交的精髓之一就是为用户制造「装逼」的便利,回答问题前很随意的「谢邀/泻药」,一切尽在不言中了。
这个功能看似很简单,Quora也是下了功夫的,Quora把A2A这事model成了一个机器学习问题:Given a question and a viewer rank all other users based on how 「well-suited」 they are。其中
「well-suited」= likelihood of viewer sending a request + likelihood of the candidate adding a good answer
既要考虑浏览用户发送邀请的可能性,又要考虑被邀请者受邀回答的可能性。Quora的blog上也有一篇文章详细讲解了他们的做法。
识别问题与时间的关系
Quora主要研究成果如下:
- 识别特定时期内与当时事件紧密相关的单词,其中的主要挑战是处理问题集中的自然语言数据。通过选定恰当的问题集合,并关注特定词性的单词,他们使用标准NLP技术TF-IDF获得了一个令人信服的单词集合。
- 综合运用专门为自然语言数据而设计的统计检验和基于图的聚簇技术,他们可以发现能够强有力地代表特定Quora历史时期的单词语境。这样,关于一个单词为什么对于特定的历史时期而言非常重要,他们就能够自动提取更多的信息。
- 他们还能够识别出这些语境如何随时间演进,而这可以让他们从Quora的讨论中看到更广泛的世界中人、企业和事件的关系。
按季度识别最有代表性的单词
由于他们最感兴趣的内容是提问者所提的问题是关于什么主题的,所以他们使用词性标注来过滤问题文本中的关键词,并且只保留名词。此外,考虑到不同国家的人有不同的背景、文化和兴趣,他们根据提问者的国籍划分了问题集合。选取最有代表性的单词有许多方法,最简单的是根据词频排序,但这种方法无法排除常用词。为此,他们选择了TF-IDF方法。在具体实现上,TF为单词在特定国家特定季度的非匿名问题中出现的次数,IDF为单词在特定国家所有问题中出现的次数,减去该单词在特定国家特定季度的非匿名问题中出现的次数,公式如下:
其中,Q表示特定季度,W表示特定单词。该方法可以提供合理的结果,但为了提高所识别出的单词和当时事件的相关性,他们对识别出的单词进行了进一步的过滤。例如,只保留在特定季度里至少被三个提问者使用过的单词。另外,去掉NLTK中定义的停用词以及在NLTK Brown语料库中出现超过10次的单词。下图是进一步过滤排序后生成的一个“单词云(word cloud)”示例:
在2011年,Quora刚刚在硅谷成立,最具代表性的单词大多数与重大技术和政治事件相关。例如,近场通信(NFC)服务推动了移动支付的广泛应用,人们在预测Groupon、Zynga和Yelp的IPO,等等。
代表性单词的语义语境
对于单词云中的单词的代表性,有的很容易解释,有的并不明显。为此,他们基于单词共现频率设计了一种自动提取单词语境的方法。与生成单词云的过程相比,他们使用了一个更大的单词集合:去掉了停用词,但并没有去掉名词之外的其他单词,也没有限制单个提问者使用某个单词的次数。他们按照如下条件对单词对进行了过滤:
- 最少共同出现了4次;
- 共现次数超期望值,即
- 随机共现的概率小于5%。
其中,N AB为单词A和B实际的共现次数,N为非匿名问题的数量,N A(N B)为出现单词A(B)的问题的数量。使用这些规则,他们构建了一个图,顶点表示单词,边连接满足上述条件的单词对。对于每条边,他们使用下面的公式赋予一个权值:
通过这种方法,他们识别出图的连通部分,并命名为“语义簇(semantic clusters)”。那些包含最有代表性单词的语义簇是他们重点关注的。下图是一个语义簇示例:
美国,2011年第2季度 该语义簇表示,Facebook在2011年6月推出了研究Facebook社交图谱的工具 Graph API Explorer。
单词关系随时间演进
在生成单词语义簇之后,他们进一步研究了单词语境随时间的演进。他们从多个季度中选取了最具代表性的单词,他们称为“关注词(focus word)”。对于每个单词A及每个与A关联的单词B,他们使用前文定义的f(A,B)计算两者在2012年到2015年之间不同季度里的共现频率指标。接下来,他们就使用这些值分析单词之间关联关系随时间的变化情况。下图是一个单词语境演进示例:
可以看出,在2012年总统大选之前,Barack Obama经常和Mitt Romney一起被提及,而在2013年8月前后同Syria相关的问题更显著了。总之,他们使用NLP技术分析问题文本,提取最有代表性的单词,并使用单词云的形式将它们可视化。然后,他们使用语义聚簇方法识别出相关度较高的一组组单词,即语义簇。最后,他们分析了一个单词的语境如何随着时间变化。
参考链接:
- https://engineering.quora.com/Applications-of-NLP-at-Quora
- https://engineering.quora.com/A-Machine-Learning-Approach-to-Ranking-Answers-on-Quora
- https://www.quora.com/What-does-a-good-answer-on-Quora-look-like-What-does-it-mean-to-be-helpful/answer/Quora-Official-Account
- https://engineering.quora.com/Ask-To-Answer-as-a-Machine-Learning-Problem
- http://www.slideshare.net/xamat/machine-learning-for-qa-sites-the-quora-example
- https://data.quora.com/The-Quora-Topic-Network-1
- https://data.quora.com/Mapping-the-Discussion-on-Quora-Over-Time-through-Question-Text
Related posts: