从噪声字符串列表中提取规范字符串


10

我有数千个字符串列表,每个列表都有大约10个字符串。给定列表中的大多数字符串都非常相似,尽管某些字符串(很少)与其他字符串完全无关,而某些字符串包含不相关的单词。可以将它们视为规范字符串的嘈杂变化。我正在寻找一种算法或库,可以将每个列表转换为该规范字符串。

这是一个这样的清单。

  • 星球大战:第四集新希望 StarWars.com
  • 星球大战第四集-新希望(1977)
  • 星球大战:第四集-新希望-烂番茄
  • 观看星球大战:第四集-免费在线新希望
  • 星球大战(1977)-最伟大的电影
  • [REC] 4个海报承诺通过舷外发动机致死-SciFiNow

对于此列表,任何与正则表达式匹配的字符串^Star Wars:? Episode IV (- )?A New Hope$都是可以接受的。

我在Coursera上看过Andrew Ng的机器学习课程,但是找不到类似的问题。


2
附注:我认为您要寻找的术语是“规范的”
肖恩·欧文

您要查找正则表达式的“最可能” /“最共识”字符串吗?还是列表中的字符串之一?
MrMeritology

@MrMeritology我不是在寻找正则表达式。我在问题中显示了一个正则表达式,目的只是为了说明我在我认为正确的字符串中的灵活性。
内酯

好。然后,我在下面给出的答案将为您服务。
MrMeritology

这是否属于NER(命名为实体识别)?
hippietrail 2014年

Answers:


4

作为一个幼稚的解决方案,我建议首先选择列表中包含最频繁标记的字符串。这样,您可以摆脱不相关的字符串。

在第二句话中,我将进行多数表决。假设3个句子:

  • 星球大战:第四集新希望 StarWars.com
  • 星球大战第四集-新希望(1977)
  • 星球大战:第四集-新希望-烂番茄

我将一一浏览令牌。我们从“明星”开始。它以所有字符串开头而获胜。“战争”也将赢得胜利。下一个是“:”。它也会赢。

所有代币将以多数票通过,直到“希望”为止。“希望”之后的下一个标记将是“ |”,“(”或“-”。没有一个将赢得多数投票,所以我将在这里停止!

另一种解决方案可能是使用最长公共子序列

正如我说的,我对此并没有太多关注。因此,可能会有更多更好的解决方案:-)


3

首先计算所有字符串对之间的编辑距离。参见http://en.wikipedia.org/wiki/Edit_distancehttp://web.stanford.edu/class/cs124/lec/med.pdf。然后根据某个距离阈值排除任何离群值字符串。

对于其余的字符串,您可以使用距离矩阵来识别最中心的字符串。根据您使用的方法,某些数据可能会得到不明确的结果。没有一种方法能完美解决所有可能。出于您的目的,您需要的是一些启发式规则来解决歧义-即选择两个或多个候选人。

也许您不想从字符串列表中选择“最中心”,而是想要生成一个正则表达式来捕获所有非异常字符串共有的模式。一种方法是合成与所有非异常字符串等距的字符串。您可以从矩阵算出所需的编辑距离,然后使用这些距离作为约束随机生成规则。然后,您将测试候选正则表达式,并接受符合约束的第一个正则表达式,并且还接受非异常值列表中的所有字符串。(从最长的公共子字符串列表开始构建正则表达式,因为它们是非通配符。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.