6

问题:我有一系列聊天消息——两个用户之间——带有时间戳。例如,我可以一次呈现一整天的聊天消息。然而,在一整天中,有多个离散的对话/会话......对于用户来说,将这些分开而不是所有天作为一个连续的流来查看会更有用。

是否有可以从时间戳“推断”隐式会话/对话开始/中断的算法或启发式方法?除了任意的“如果间隔超过 x 分钟,这是一个单独的会话”。如果这是唯一的情况,这个间隔是如何确定的?无论如何,我想避免这种情况。

例如,在 2:00 到 3:00 之间发送了 50 条消息,然后是休息时间,然后在 4:00 到 5:00 之间发送了 20 条消息。中间会插入一个中断...但是如何确定中断?

我确信已经有关于这个主题的文献,但我只是不知道要搜索什么。

我一直在玩边缘检测算法和基于梯度的方法。

(有关更多说明,请参阅评论)

4

1 回答 1

3

编辑(更好的主意):

您可以将每条消息视为两种类型:

  1. 上一次谈话的继续
  2. 全新的对话

您可以将这两种类型的消息建模为独立的Poisson 过程,其中相邻消息之间的时间差呈指数分布

然后,您可以根据经验手动确定这两种类型的消息的指数参数(考虑到一些初始数据,这不会太难)。现在你有了这两个事件的模型。

最后,当有新消息出现时,您可以计算消息属于类型 1 或类型 2 的概率。如果是类型 2,那么您有一个新的对话。

澄清:

考虑到延迟是一段时间,消息是新对话的概率T

P(new conversation | delay=T) = P(new conversation AND delay=T)/P(delay=T)

使用贝叶斯法则:

= P(delay=T | new conversation)*P(new conversation)/P(delay=T)

同样的计算也适用于P(old conversation | delay=T)

P(delay=T | new conversation)来自模型。P(new conversation)很容易从用于生成模型的数据中计算出来。P(delay=T)您根本不需要计算,因为您要做的就是比较两个概率。


相邻消息之间时间戳的差异取决于对话的类型和参与的人。因此,您需要一种考虑局部特征的算法,而不是全局阈值参数。

我的提议如下:

  1. 获取最后 10 条相邻消息之间的时间差。
  2. 计算平均值(或中位数)
  3. 如果到下一条消息的延迟超过平均值的 30 倍,则这是一个新对话。

当然,这些数字是我当场得出的。它们必须进行调整以适应您的目的。

于 2012-07-24T21:08:02.777 回答