Twitter的线程推文应该遵循哪些好的启发式方法?

14
每个人都知道,如果你想要将电子邮件进行分组,你可以使用Jamie Zawinski的算法。但现在已经是新世纪了,有了新的消息服务。
那么,在Twitter上对状态更新进行分组的最佳算法是什么呢?
以下是我希望它一定能处理的事情:
  • 简单部分:使用in_reply_to_status_idin_reply_to_user_idin_reply_to_screen_name。(顺便提一句,找到这些值的适当文档本身就很有用!例如,这样的文档并没有明显地链接到here。)

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

  • 在超过两个用户之间进行的对话。

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

...但是也许你可以想出更多。

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”或其他标识符为前导,表明这不是针对该人的直接回复?
  • 原始更新的作者的跟随/被跟随比率。
  • 等等。
  • 等等。

建议尽可能提供更多这样的内容,因为分类器只会使用那些被证明有用的内容。我建议尝试使用随机森林分类器,它方便地在Weka中实现。

接下来需要一个训练集。一开始可以很小,只要足够让服务识别对话即可。对于这个基本服务,还需要添加一个漂亮的界面来纠正不匹配或错误链接的更新,以便用户进行更正。使用这些数据,可以构建一个更大的训练集和更准确的分类器。

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


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

3
RT 不是回复,而是“转推”。 这只是意味着你在重复别人说的话,并在后面加上归属标识。 - Bill the Lizard
1
根据我的经验,它被用于两种情况。人们通常在回复时使用格式“<reply> RT <@name> <quote message as far as space allows>”。 - user85509

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接