建议主题 - 基于标题和内容的建议

如果推荐的主题能结合主题标题和内容,那将会非常棒。例如,如果正在阅读一个关于“分析”的主题,那么包含相似内容的主题可以混合到当前的推荐结果中。

如果这能够高效实现,我确信这将是提升新用户和活跃用户参与度的必赢之举。即使这些推荐仅使用主题标题(而非标题加内容),效果也会很好。

6 个赞

我创建了一个类似的帖子,但它已被锁定。
目前我已禁用此功能,并用我自己的功能替代。

1 个赞

高效构建这一功能非常复杂,且涉及的探索范围极其庞大。到了某个阶段,你甚至需要考虑机器学习,而其中的复杂程度会层层加深。

我理解利用 AI 来确定相关内容的吸引力,这在 Support 话题上尤其实用,几乎可以实现“自助服务”。你发布一个问题,机器学习模型筛选出 10 个候选话题并直接作为回复发布,你可以选择接受或删除。同样,当匿名用户寻求支持时,展示相关内容也非常有帮助。

话虽如此……这是一项极其庞大的任务。我们明年的路线图并未包含此项计划。不过,@eviltrout 一直热衷于在某个时间点尝试 AI/ML,而这类项目正与此相关。

@codinghorror 仍然是 DJ Random 的忠实拥趸,因为他认为 Random 算法的表现往往能超越许多复杂的花哨算法(事实也常常如此)。

7 个赞

DJ random 非常棒,不过我们会根据时间和类别/标签进行限制——这一点很重要。

3 个赞

大家好,

我是新来的,如果我在重复老生常谈,先说声抱歉。

我同意 @sam 的观点,这里确实有个“深坑”,但另一方面,主题建模技术现在已经相当成熟,市面上也有现成的优秀工具。我最近的一个项目分析了约 500 万份专利标题和摘要;在我新搭建的 Discourse 社区 站点 上分析成千上万个主题简直是小菜一碟。而且,我的社区成员也有意愿推动这件事落地。

想请教各位专家:我是否应该考虑开发一个插件?还是应该直接修改 Discourse 的源代码(我已从 GitHub 下载)?

我找到了这篇关于用 Python 抓取 Discourse 论坛主题的帖子 链接,但尚未成功运行。类似的方法应该能让我将数据拉取到本地,构建模型,以便后续查询加载。

顺便提一下,大多数优秀的工具都是基于 Python 的……

4 个赞

从功能上讲,它最适合出现在撰写新主题时的“您的主题与…相似”面板中。

1 个赞

我强烈建议在此处使用插件,而不是直接修改源代码。我们几乎不可能将此类功能集成到核心中,因为这需要引入庞大的 Python 依赖,以及大量的训练界面等。

关于训练机制等方面还有很多工作要做。您能否详细说明一下您计划如何进行训练?您推荐使用哪些具体的模型?当一个主题有 100 篇帖子或 1000 篇帖子时会发生什么?

您会采用哪些信号源?对于每项指标(如浏览量、分类、标签等)您会赋予多大的权重?

我非常支持这个项目,但感觉这确实是一项相当庞大的任务。

3 个赞

关于训练机制等方面还有很多工作要做。您能否概述一下您会采用哪些训练机制?您会推荐使用哪些具体模型?

我团队目前使用的工具来自 gensim。它拥有标准的 Python 模块 接口,并且已经过多年充分测试。

我脑海中浮现的实施方案如下:

  • 第一步:选择文档集。可以是所有主题根节点,也可以是所有帖子。

每隔一段时间(例如每周一次?每月一次?视论坛流量而定),构建 doc2vec 模型:

  • 将 Discourse 主题抓取到一个或多个 Markdown 文本文件中,包含标题和主题正文。此时将每个主题视为一个文档,即 gensim 算法中的“文档”。
  • 运行标准 NLP 工具处理文档,包括词干提取等。
  • 使用 doc2vec(来自 gensim 实现)构建一个模型,将每个文档映射到 d 维空间中的向量。您必须通过实验选择元参数 d;Google 在其专利模型中使用 d=40;我不确定 Google Scholar 使用的 d 值是多少。我通常使用 d=200。空间的每一维都可以被视为与语义内容相关的“特征”。
    • (供参考:doc2vec 算法通过训练一个旨在学习词序列的神经网络来构建特征空间;该神经网络拥有一个 d 维的隐藏层;隐藏层的输出构成了特征的潜在空间。)
  • 构建模型是耗时最重的任务,具体取决于文档数量。38 年的专利数据 = 500 万文档;在拥有 8 核的旧机器上,doc2vec 模型需要运行一整夜。
  • 可选的进一步有趣任务:对 d 维特征空间中的文档云进行聚类。
    • 可以使用现成的聚类工具,例如来自 Python sklearn 库的工具。
    • 聚类会产生一种涌现分类;有趣的研究问题包括这些分类如何与关键词(或 Discourse 标签)类别重叠。

以上过程将离线进行。然后在线部分:

  • 加载模型。
  • 模型加载后,解析新文档并查询其在 d 维特征空间中的位置是一项相对轻量级的任务。
    • 注意,这个新文档不会触发模型的重新构建。模型对于在线查询将是静态的。新文档将在下一次(例如每周)模型构建时被纳入。
  • 最后一步轻量级任务是查询特征空间中邻近的文档。Gensim 有工具可以获取邻近文档列表,但您也可以直接使用 NumPy 将所有文档向量加载到类似 kd-tree 的结构中,从而直接快速查询邻近点。

当一个主题有 100 篇帖子?1000 篇帖子时会发生什么?

离线部分大致与文档数量呈线性扩展,但对于 1 万到 10 万份文档来说应该非常易于管理。即使是 100 万份文档,对于每周的批量处理来说也没问题。

您会使用什么作为信号,并赋予每个因素(浏览量/类别/标签等)多大的权重?

在此上下文中,新主题的“信号强度”直接解释为新主题向量空间嵌入与现有文档向量之间的(逆)距离。人们可以结合其他因素(如点赞数、浏览量等)来增强这一信号,但这些只是我在描述的基本算法之外的额外修饰。

一旦我(或某人)让抓取工作正常运行,上述离线部分就相当简单且机械。

难点(对我来说)在于在线部分,这需要将 Discourse 的 Rails 接口与少量 Python 调用(例如调用 gensim 工具)进行对接。任何此类接口的示例对我都会很有帮助。

6 个赞

@Bcat:我很想看看你是如何“用你的替换”的。你有可以查看的插件或代码仓库吗?

这里棘手的性能问题在于 RPC 机制。你不想为每一次主题浏览都启动一个新的 Python 进程。

即使是 HTTP 调用也可能太慢。

或许……可以填充一个 related_topics(包含 topic_idrelated_topic_idrank)表?这样你就可以利用 WebHooks 在人们发布新主题时快速更新该表,而 Ruby 无需再调用 Python。

在 Discourse 端的实现会相当简单,你只需重写该方法,使其在你的新 related_topics 表中查找信息即可。

2 个赞

旧方法行不通,所以我用 Google 广告取而代之。Google 提供的主题建议非常巧妙。至于旧的做法,我关闭了默认建议,并替换为一段 JavaScript 代码片段,该片段调用 /search 接口,然后返回一个主题列表。

2 个赞

感谢提供关于表格实现的指引。不过,我不确定表格方法是否具备可扩展性。对于 N 个主题,我们需要一个大小为 N^2 的表格。因此,对于 10^4 个主题,表格将包含 10^8 个条目。

我看不出如何避免调用 Python 来解析新主题、生成嵌入并查找最近邻。过去我曾构建过 Web 界面,但在这里我可能会倾向于在后台运行一个 Python 进程,并通过套接字或管道与 Discourse 通信,其方式更像是对文件的读写,而非实际的 Python 函数调用。(毕竟,这一切都在我的服务器上运行……)

抱歉,我觉得我完全误解了?

如果你有 100 个主题,每个主题显示 5 个相关主题,为什么表的大小需要超过 500?

1 个赞

N 个主题对应于向量空间表示中的 N 个点。
点与点之间的距离矩阵大小为 N²(由于矩阵对称,独立值为 N*(N-1)/2)。这就是我提到的 N²。

不过,巧妙的数据结构(例如 kd 树)可以在无需暴力搜索 N² 差异表的情况下找到最近邻。

总之,我知道如何在 Python 中完成所有这些操作,并返回你所提到的小表,即 N 行 5 列,表示每个主题对应的 5 个最近主题。

1 个赞

那么,如果你每天在 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 集成的方法的说明,似乎是相关的。

3 个赞

更新,这已在 Discourse AI 插件中实现 :confetti_ball:

5 个赞