如果推荐的主题能结合主题标题和内容,那将会非常棒。例如,如果正在阅读一个关于“分析”的主题,那么包含相似内容的主题可以混合到当前的推荐结果中。
如果这能够高效实现,我确信这将是提升新用户和活跃用户参与度的必赢之举。即使这些推荐仅使用主题标题(而非标题加内容),效果也会很好。
如果推荐的主题能结合主题标题和内容,那将会非常棒。例如,如果正在阅读一个关于“分析”的主题,那么包含相似内容的主题可以混合到当前的推荐结果中。
如果这能够高效实现,我确信这将是提升新用户和活跃用户参与度的必赢之举。即使这些推荐仅使用主题标题(而非标题加内容),效果也会很好。
高效构建这一功能非常复杂,且涉及的探索范围极其庞大。到了某个阶段,你甚至需要考虑机器学习,而其中的复杂程度会层层加深。
我理解利用 AI 来确定相关内容的吸引力,这在 Support 话题上尤其实用,几乎可以实现“自助服务”。你发布一个问题,机器学习模型筛选出 10 个候选话题并直接作为回复发布,你可以选择接受或删除。同样,当匿名用户寻求支持时,展示相关内容也非常有帮助。
话虽如此……这是一项极其庞大的任务。我们明年的路线图并未包含此项计划。不过,@eviltrout 一直热衷于在某个时间点尝试 AI/ML,而这类项目正与此相关。
@codinghorror 仍然是 DJ Random 的忠实拥趸,因为他认为 Random 算法的表现往往能超越许多复杂的花哨算法(事实也常常如此)。
DJ random 非常棒,不过我们会根据时间和类别/标签进行限制——这一点很重要。
大家好,
我是新来的,如果我在重复老生常谈,先说声抱歉。
我同意 @sam 的观点,这里确实有个“深坑”,但另一方面,主题建模技术现在已经相当成熟,市面上也有现成的优秀工具。我最近的一个项目分析了约 500 万份专利标题和摘要;在我新搭建的 Discourse 社区 站点 上分析成千上万个主题简直是小菜一碟。而且,我的社区成员也有意愿推动这件事落地。
想请教各位专家:我是否应该考虑开发一个插件?还是应该直接修改 Discourse 的源代码(我已从 GitHub 下载)?
我找到了这篇关于用 Python 抓取 Discourse 论坛主题的帖子 链接,但尚未成功运行。类似的方法应该能让我将数据拉取到本地,构建模型,以便后续查询加载。
顺便提一下,大多数优秀的工具都是基于 Python 的……
从功能上讲,它最适合出现在撰写新主题时的“您的主题与…相似”面板中。
我强烈建议在此处使用插件,而不是直接修改源代码。我们几乎不可能将此类功能集成到核心中,因为这需要引入庞大的 Python 依赖,以及大量的训练界面等。
关于训练机制等方面还有很多工作要做。您能否详细说明一下您计划如何进行训练?您推荐使用哪些具体的模型?当一个主题有 100 篇帖子或 1000 篇帖子时会发生什么?
您会采用哪些信号源?对于每项指标(如浏览量、分类、标签等)您会赋予多大的权重?
我非常支持这个项目,但感觉这确实是一项相当庞大的任务。
关于训练机制等方面还有很多工作要做。您能否概述一下您会采用哪些训练机制?您会推荐使用哪些具体模型?
我团队目前使用的工具来自 gensim。它拥有标准的 Python 模块 接口,并且已经过多年充分测试。
我脑海中浮现的实施方案如下:
每隔一段时间(例如每周一次?每月一次?视论坛流量而定),构建 doc2vec 模型:
doc2vec(来自 gensim 实现)构建一个模型,将每个文档映射到 d 维空间中的向量。您必须通过实验选择元参数 d;Google 在其专利模型中使用 d=40;我不确定 Google Scholar 使用的 d 值是多少。我通常使用 d=200。空间的每一维都可以被视为与语义内容相关的“特征”。
以上过程将离线进行。然后在线部分:
当一个主题有 100 篇帖子?1000 篇帖子时会发生什么?
离线部分大致与文档数量呈线性扩展,但对于 1 万到 10 万份文档来说应该非常易于管理。即使是 100 万份文档,对于每周的批量处理来说也没问题。
您会使用什么作为信号,并赋予每个因素(浏览量/类别/标签等)多大的权重?
在此上下文中,新主题的“信号强度”直接解释为新主题向量空间嵌入与现有文档向量之间的(逆)距离。人们可以结合其他因素(如点赞数、浏览量等)来增强这一信号,但这些只是我在描述的基本算法之外的额外修饰。
一旦我(或某人)让抓取工作正常运行,上述离线部分就相当简单且机械。
难点(对我来说)在于在线部分,这需要将 Discourse 的 Rails 接口与少量 Python 调用(例如调用 gensim 工具)进行对接。任何此类接口的示例对我都会很有帮助。
@Bcat:我很想看看你是如何“用你的替换”的。你有可以查看的插件或代码仓库吗?
这里棘手的性能问题在于 RPC 机制。你不想为每一次主题浏览都启动一个新的 Python 进程。
即使是 HTTP 调用也可能太慢。
或许……可以填充一个 related_topics(包含 topic_id、related_topic_id 和 rank)表?这样你就可以利用 WebHooks 在人们发布新主题时快速更新该表,而 Ruby 无需再调用 Python。
在 Discourse 端的实现会相当简单,你只需重写该方法,使其在你的新 related_topics 表中查找信息即可。
旧方法行不通,所以我用 Google 广告取而代之。Google 提供的主题建议非常巧妙。至于旧的做法,我关闭了默认建议,并替换为一段 JavaScript 代码片段,该片段调用 /search 接口,然后返回一个主题列表。
感谢提供关于表格实现的指引。不过,我不确定表格方法是否具备可扩展性。对于 N 个主题,我们需要一个大小为 N^2 的表格。因此,对于 10^4 个主题,表格将包含 10^8 个条目。
我看不出如何避免调用 Python 来解析新主题、生成嵌入并查找最近邻。过去我曾构建过 Web 界面,但在这里我可能会倾向于在后台运行一个 Python 进程,并通过套接字或管道与 Discourse 通信,其方式更像是对文件的读写,而非实际的 Python 函数调用。(毕竟,这一切都在我的服务器上运行……)
抱歉,我觉得我完全误解了?
如果你有 100 个主题,每个主题显示 5 个相关主题,为什么表的大小需要超过 500?
N 个主题对应于向量空间表示中的 N 个点。
点与点之间的距离矩阵大小为 N²(由于矩阵对称,独立值为 N*(N-1)/2)。这就是我提到的 N²。
不过,巧妙的数据结构(例如 kd 树)可以在无需暴力搜索 N² 差异表的情况下找到最近邻。
总之,我知道如何在 Python 中完成所有这些操作,并返回你所提到的小表,即 N 行 5 列,表示每个主题对应的 5 个最近主题。
那么,如果你每天在 Python 中运行这个脚本,就可以直接将 Python 连接到 Discourse 数据库,让它生成这个缓存表。
这样一来,Discourse 插件部分就变得非常简单了。它不再从位置 X 进行选择,而是从位置 Y(另一个表)进行选择。
你不再需要为了单个请求而让管道在两种编程语言之间艰难地协调。
这里提出的 AI 方法听起来很有趣,可能是理想的解决方案。
我想知道是否值得研究一种不太技术性的方法——“建议主题”部分可以包含一个“建议主题”按钮。单击该按钮将允许用户发布指向网站上另一个主题的链接,以及对其两个主题相关性的简短描述。
这不是一个正式的模拟图,但为了确保我们有共同的理解,我的意思是这样的:
就背景而言,我感兴趣的是建议那些既支持又反驳特定主题中观点的相关主题。例如,如果有人创建一个声称气候变化不是大问题的帖子,我希望网站上的用户能够建议相关主题,以反驳或支持该论点。
它对于争议较小的主题也可能很有用。在此回复有关某个主题的帖子时,我经常会利用该网站的搜索功能来查看是否有相关主题。通过允许用户建议相关主题,可以保留该努力的结果。例如,阅读这个主题让我想到了 Discourse 最近在此处使用 AI:https://meta.discourse.org/t/disorder-automatic-toxicity-detection-for-your-community/246587/1。在我看来,让该主题出现在此主题的建议主题列表中,并附有提及 Discourse 似乎正在研究将论坛与 AI 集成的方法的说明,似乎是相关的。
更新,这已在 Discourse AI 插件中实现 ![]()