公司:知乎
知乎是一家中国大陆的问答网站,创立于2011年1月26日,产品形态与美国在线问答网站Quora类似。“知乎”在文言文中意为“知道吗”。2012年2月底,知乎使用“发现更大的世界”作为其宣传口号。截至2017年9月20日,知乎注册用户数超1亿,日活跃用户量达2600万,人均日访问时长1小时,月浏览量180亿。截至2016年5月,知乎累计产生了1000万个提问、3400万个回答和3500万个赞同。2021年至纽交所上市,在挖掘优质创作会员与投入自有内容的同时,随着多样性的社群文化增加,知乎越来越类似于reddit等同好论坛。
知乎由北京智者天下科技有限公司(法律性质为有限责任公司)所持有,其法律代表人是李大海。智者天下亦开发了包括Android、iOS平台的手机“知乎客户端”、“知乎群组”、“知乎日报”与“公益壹点通”四款手机应用程序。
知乎核心业务 MongoDB 集群丝滑上云迁移实践之路
探索云上 MongoDB 服务最佳解决方案。
基于大模型的海量标签多分类方法
知乎作为中文互联网高质量的问答社区,积累了海量的问答、文章、想法等不同形态的内容数据,如何对内容进行高质量刻画和分发,提升用户的整体体验,成为算法工程师们亟须解决的问题。为此,我们需要对内容进行深入理解和刻画,并将高质量的内容匹配到感兴趣的用户群体,从而实现高质量分发和提升用户体验。
知乎超大规模TiDB集群管控实践
TiDB 是一款开源的分布式关系型数据库,兼容 MySQL 协议,支持水平扩展,具有强一致性和高可用性。它融合了传统关系型数据库与 NoSQL 的优势,支持大规模数据处理,适合处理高并发、复杂查询和大数据存储的场景,广泛应用于金融、互联网等行业。
kids:知乎日志系统
这篇文章介绍了一个名为Kids的日志系统,它是为了构建一个方便实时订阅应用日志的anti-spam系统而开发的。Kids系统具有分布式收集、集中存储、实时订阅、不丢失数据和对应用性能影响小等特点。文章提供了Kids的样例配置文件和发布订阅的简单操作方法。Kids系统的配置文件可以通过不同类型的store来实现日志的写入、丢弃和转发等功能。同时,Kids系统还支持远程节点和备用文件存储,以确保数据不丢失。该系统的协议与Redis协议兼容,可以通过Redis客户端进行订阅操作。
Yet another Sketch Mirror App for Android
Sketch是一种设计产品交互原型的主流工具,但在Android手机上无法使用官方提供的Sketch Mirror。文章介绍了三种在Android上预览Sketch文件的方式,并推荐了一个实现了实时预览功能的Sketch Mirror App for Android。使用时需要注意良好的WIFI环境、分辨率适配以及不支持横屏/分屏模式等问题。连接Sketch的原理是通过WebSocket传输数据,第三方软件可以读取这些数据实现实时预览功能。
Spark 在反作弊聚类场景的实践
知乎最近开始尝试使用聚类的方式去发现和挖掘spam用户。聚类的目的是将相似的内容和行为聚集在一起。常见的聚类方法有k-means、层次聚类以及基于密度和图的聚类分析方案。相似度的度量是聚类的关键之一,常用的相似度算法有edit distance、cosine similarity、Jaccard相似度和pearson相关系数等。本次聚类使用了Jaccard和sim-hash算法,其中sim-hash适用于数据量较大的场景。sim-hash的计算过程包括词的hash值计算、加权、合并、降维和相似度比较。相似度比较使用hamming distance来衡量。
Wukong 反作弊系统缓存的优化
知乎反作弊系统Wukong进行了局部重构,主要解决了重复查询和大数据量查询对Mongodb读压力过大的问题。重复查询指的是相隔时间很短的多个相同类型的Action,而大数据量查询则是查询结果的一大部分是相同的。这些问题只存在于某些策略中,对于其他策略并不适用。重构的目标是减轻对Mongodb的读压力,放开读的条数限制,提高系统性能。
知乎服务化的实践与思考
知乎在服务化过程中遇到了服务数量不可控、RPC分拆的发布风险和性能问题。他们发现基于SSO机制对HTTP接口进行垂直拆分是可行的,可以灰度控制风险,并对客户端透明。新项目与主站的耦合较低,只需要少量RPC接口,并且对外暴露的接口也很少。这种拆分方式可以降低主站联动的发布频率,减少发布风险。他们得到的启发是,服务的分拆应该减少RPC,增加内聚,以实现更稳定的接口和较小的服务边界。
知乎 SiriKit 实战
本文介绍了苹果在WWDC 2016上开放的SiriKit,以及其设计理念和实践。SiriKit是一款智能语音助手软件,开发者可以利用其API将自己的服务提供给用户。SiriKit可以实现语音和视频通话、发送消息、发送或接收付款、照片搜索、打车和管理健身等功能。使用SiriKit可以为应用增加系统级的入口,提升用户体验,并且能够在系统应用中使用自己的服务。同时,文章还详细介绍了SiriKit的Intent处理流程,包括Speech、Intent和Action三个步骤,以及不同意图下的信息采集。
反作弊基于左右信息熵和互信息的新词挖掘
这篇文章讲述了团队通过挖掘未登录词来应对站内的恶意营销问题。为了确定一个词是否可以成为新词,团队使用了信息熵和互信息这两个指标。信息熵用来衡量词语在不同语境中的出现频率,互信息则衡量两个词之间的共享信息量。通过计算候选词的左右信息熵和互信息,团队可以判断是否可以形成新词。这种方法取得了良好的效果。简而言之,团队通过分析词语的特点和关联性来解决恶意营销问题。
RxLifecycle: 绑定你的 Observable 到生命周期上
RxJava 是 Android 开发中的一件神器,但要注意在 Activity 或 Fragment 里使用 RxJava 时可能导致内存泄漏。文章提供了一个解决方案,即在 Activity 销毁时手动切断 Observable 与 Observer 的联系。然而,这种方法不够优雅,需要保存 Disposable 的引用并手工进行 Dispose。文章介绍了一种更优雅的方法,即使用 Rx 官方提供的操作符 TakeUtil,可以提前中止 Observable 与 Observer 的联系。通过创建一个变换操作符,可以实现自动释放对 Observer 的引用。
Matisse Android 图片选择器
本文介绍了一款名为Matisse的图片选择器,它可以帮助开发者方便地在Android应用中选择图片。与系统组件相比,Matisse具有更符合业务场景的界面和交互,并且支持日夜间模式。Matisse的调用非常简单,只需传入一些参数即可实现图片选择功能。它支持多种图片类型的选择,可以有序选择图片并指定最大可选数量,还可以定义筛选规则和缩略图的缩放比例。此外,Matisse还支持横竖屏切换,并且可以与不同的图片加载库一起使用。
Python 缓存框架 Tache 使用介绍
Tache是一个Python的缓存框架,支持Python2和Python3。它能缓存不同类型的函数和方法,并支持基于标签的缓存和失效。文章提供了两个使用案例:一是使用标签实现批量失效,只需失效一个对象变更处;二是使用标签控制分页操作的缓存,保证增加和删除评论时的缓存一起失效。同时,文章介绍了批量缓存的使用,可以对列表中的多个元素进行批量缓存。针对分页操作,文章提供了get_comments函数的重构示例,使用标签来缓存评论数据。
算法在社区氛围的应用(一):识别垃圾广告导流信息
为了维护社区氛围,知一声通过使用BILSTM-CRF模型识别和控制垃圾广告。该模型结合了LSTM和CRF的优点,在序列标注任务上表现优异。模型的目标函数由最后一层决定,通过最小化负对数似然来优化参数。训练数据需要标记,并且可能需要考虑导流信息的前后缀。CRF层利用viterbi解码算法从状态分数和转移矩阵中解码输出状态序列。通过分析导流样本,模型在识别导流内容方面表现出色。
算法在社区氛围的应用(二):深度学习在不友善文本识别中的应用
知乎通过深度学习算法辅助审核不友善内容,提高了举报处理效率。每天收到约25,000条举报,其中大约7,000条关于不友善内容。如果算法预测某条内容为不友善,会在0.3秒内删除并发送私信通知。非不友善内容会被忽略,其他内容会进行多次人工审核。知乎重视每一个举报,根据举报增强算法的准确度,并每天全量审核新产生的内容。由于数据不均衡和词语分布的特点,全量内容模型的准确率要达到98%以上非常困难,因此采取适当的阈值来维持召回内容的处理准确率在80%以上,并进行人工审核。知乎的不友善内容处理系统使用深度学习模型,其中采用了Google的word2vec词向量模型。
算法在社区氛围的应用(三):机器学习在答非所问识别上的运用
这篇文章介绍了使用随机森林算法来识别答非所问的内容。随机森林通过多棵分类树的投票来确定分类结果。文章还提到了特征工程和训练样本集的生成。对于Random Forest的实现,作者使用Spark中的Random Forest完成了模型的迭代,取得了不错的结果。此外,文章还分析了与时间和回答的暴光有关的特征对识别的影响。根据图表显示,经过一天的时间累积,准确率达到90%,但召回率只有40%。随着时间的增加,准确率和召回率有所提升。