算法/启发式用于通过"会话"/来自时间戳的隐式会话对聊天消息历史进行分组?

Jus*_* L. 6 algorithm heuristics

问题:我有一系列聊天消息 - 两个用户之间 - 带有时间戳.比如说,我可以同时呈现一整天的聊天消息.然而,在一整天中,存在多个离散的对话/会话......并且对于用户而言,将这些分开而不是作为一个连续流的所有日子将更有用.

是否存在可以"推断"隐式会话/会话从时间戳开始/中断的算法或启发式算法?除了任意'如果差距大于x分钟,它是一个单独的会话'.如果这是唯一的情况,这个间隔是如何确定的?无论如何,我想避免这种情况.

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

我确信已有关于这个主题的文献,但我不知道该搜索什么.

我有一段时间玩边缘检测算法和基于梯度的方法.

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

tsk*_*zzy 3

编辑(更好的主意):

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

  1. 先前对话的延续
  2. 全新的对话

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

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

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

澄清:

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

P(new conversation | delay=T) = P(new conversation AND delay=T)/P(delay=T)
Run Code Online (Sandbox Code Playgroud)

使用贝叶斯规则:

= P(delay=T | new conversation)*P(new conversation)/P(delay=T)
Run Code Online (Sandbox Code Playgroud)

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

P(delay=T | new conversation)来自模型。P(new conversation)可以根据用于生成模型的数据轻松计算。P(delay=T)您根本不需要计算,因为您要做的只是比较两个概率。


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

我的建议如下:

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

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