14

每个人都知道,如果您想串接电子邮件,您可以使用Jamie Zawinski 的算法。但这是一个新世纪,并且有一种新的消息服务。

Twitter 上发布的线程状态更新的最佳算法是什么?

我绝对希望它处理的事情:

  • 最简单的部分:使用in_reply_to_status_id, in_reply_to_user_idin_reply_to_screen_name. (顺便说一句,找到这些值的适当文档本身就很有用!例如,此类文档显然与 from here没有关联。)

  • 从提到具有@约定的用户但未明确回复特定消息的消息中推断“回复”关系的良好启发式方法。 如果您要求,这些“提及”现在会在状态的“实体”元素中提供。这些启发式可能会考虑 (a) 两次状态更新之间的时间,(b) 两个用户之间是否有后续回复等。(回复由旧式转发和附加评论组成,如user85509 所述以下 只是这种回复方式的一个例子。)

  • 发生在两个以上用户之间的对话。

  • 使用一组给算法的推文,或 Twitter 上的所有推文。

...但也许您可以想到更多。

4

2 回答 2

6

由于只有一个答案,而且赏金截止日期很快就要到了,我想我应该添加一个基线答案,这样赏金就不会自动授予一个不会增加太多超出问题内容的答案。

显而易见的第一步是获取您的原始推文集并按照所有in_reply_to_status_id链接构建许多有向无环图。这些关系您几乎可以 100% 确定。(即使通过不在原始集合中的推文,您也应该关注这些链接,将这些推文添加到您正在考虑的状态更新集合中。)

除了这个简单的步骤之外,还必须处理“提及”。与电子邮件线程不同,没有什么比可以匹配的主题行更有用的了——这不可避免地很容易出错。我将采取的方法是为状态 ID 之间的每个可能的关系创建一个特征向量,这些关系可能由该推文中的提及表示,然后训练一个分类器来猜测最佳选项,包括“不回复”选项。

要计算出“所有可能的关系”位,首先要考虑提到一个或多个其他用户且不包含in_reply_to_status_id. 假设这些推文之一的示例是:1

@a @b no it isn't lol  RT @c Yes, absolutely. /cc @stephenfry

...您将为此更新与上周(例如)时间线中具有较早日期的每个更新之间的关系创建一个特征向量,以及该更新与特殊“无回复”@a更新之间@b@c一个@stephenfry. 然后你必须创建一个特征向量 - 你可以添加任何你想要的东西,但我至少建议添加:

  • 两次更新之间经过的时间 - 大概回复更有可能是最近的更新。
  • 就出现提及的单词而言,通过推文的方式所占的比例。例如,如果这是第一个词,这将是 0 分,这可能比更新中稍后提到的更可能表示回复。
  • 所提及用户的追随者数量 - 名人可能更容易被垃圾邮件提及。
  • 更新之间的最长公共子字符串的长度,这可能表示直接引用。
  • 提及之前是否有“/cc”或其他表示这不是直接回复该人的指示符?
  • 原始更新作者的following / followed比率。
  • 等等
  • 等等

这些越多越好,因为分类器只会使用那些被证明是有用的。我建议尝试使用Weka方便地实现的随机森林分类器。

下一个需要一个训练集。起初这可能很小 - 足以让识别对话的服务正常运行。对于这个基本服务,必须添加一个很好的界面来纠正不匹配或错误链接的更新,以便用户可以纠正它们。使用这些数据可以构建更大的训练集和更准确的分类器。

1 ...这可能是 Twitter 上的典型话语水平;)

于 2011-03-28T08:14:30.753 回答
0

在 Twitter 上,人们经常在他们正在回复的消息前写上“RT”。

于 2010-08-24T00:26:18.000 回答