我们正在处理来自某些不支持短信连接的运营商(Sprint)的短信。在某些情况下,我们会收到随机排列的消息,我想将它们拼接回原始文本中。文本每次都很明显,但这是一个示例消息。
以下是我们收到的订单中的消息
收到第1名,应该是3 - 96个字符
需要在尽可能高的水平上完成我的工作。我有 所有ABC调查都收到100分。
收到第2名,应该是第1名--159个字符
自2014年10月以来,我作为小工具制造商一直在这个部门工作 我是优秀的客户服务团队。我也收到了一个 我已经四分之一
收到第3名,应该是第2名--157个字符
符合资格。我也多次获得Top Performer 以及在总统俱乐部13次。我非常精通 所有申请
我想将这些重新订购为原始文本
自2014年10月以来,我作为小工具制造商一直在这个部门工作 我是优秀的客户服务团队。我也收到了一个 我有资格参加的季度。我也收到了Top Performer 多次以及总统俱乐部13次。我是 非常精通所有在我的工作所需的应用程序 最高级别。我在ABC调查中收到了100份。
有没有人知道如何做到这一点?
答案 0 :(得分:4)
一般而言,一种天真的方法是使用语言模型来决定哪种排序是最“自然”的。 我无法提供任何代码,因为您没有提供此框架的任何细节。
您应该使用与文本语料库相似的模型(在词汇,拼写等方面)。 生成所有可能的排序,然后测量模型对每个排序的困惑。
(生成所有排列是O(n!)
,这或多或少是最坏的情况,但对于小n
s(SMS片段的数量),它应该没问题。
但如果这是一个问题,您可以构建片段的n
×n
矩阵,并使用Viterbi算法找到最佳路径,对语言模型进行增量查找。你必须以某种方式强制执行所有碎片发生的路径。)
答案 1 :(得分:0)
我从lenz的回答中提出了生成所有排列的建议,并尝试使用Conditional Probabilities from Azure但收效甚微。该服务仍处于测试阶段,当然对我们的测试消息没有帮助。收到的短信会有很大差异,所以我们似乎不太可能创建模型并测试可能的排序。
在我们的特定情况下,我们确定运营商(Sprint)基于空格中断消息,并且每条消息中最多只发送160个字符。基于该数据,我们生成了消息的每个可能的排序,以查看运营商是否会以这种方式破坏消息。根据上面的3条消息,这些消息有6种可能的排序方式。 (下同)
<强> 1-2-3 强>
1 -> 2: 96 + " I" = 98. 98 < 160 - Not a valid possibility
2 -> 3: 159 characters + " been" = 164. 164 >= 160 - OK
<强> 1-3-2 强>
1 -> 3: 96 characters + " been" = 101. 101 < 160 - Not a valid possibility
3 -> 2: 157 characters + " I" = 159. 159 < 160 - Not a valid possibility
<强> 2-1-3 强>
2 -> 1: 159 characters + " needed" = 166. 166 >= 160 - OK
1 -> 3: 96 characters + " been" = 101. 101 < 160 - Not a valid possibility
<强> 2-3-1 强>
2 -> 3: 159 characters + " been" = 164. 164 >= 160 - OK
3 -> 1: 157 characters + " needed" = 164. 164 >= 160 - OK
<强> 3-2-1 强>
3 -> 2: 157 characters + " I" = 159. 159 < 160 - Not a valid possibility
2 -> 1: 159 characters + " needed" = 166. 166 >= 160 - OK`
<强> 3-1-2 强>
3 -> 1: 157 characters + " needed" = 164. 164 >= 160 - OK
1 -> 2: 96 + " I" = 98. 98 < 160 - Not a valid possibility
从上面的计算可以看出,唯一有效的组合是2-3-1。其他组合会有不同的分歧。在我们有一种可能性的情况下,我们将其用作“答案”。
如果我们有超过1种可能性的场景,我们会使用一些基于大小写和标点符号的加权算法来找到最佳拟合。如果我们仍然无法确定答案,那么我们在收到消息的顺序中取得了最高的加权结果(它们在大多数时间以正确的顺序排列)。