我有一个应用程序,用于从网络上的不同来源抓取足球比赛结果。不同网站上的球队名称并不一致——例如,曼联在一个网站上可能被称为“Man Utd”,在第二个网站上被称为“Man United”,在第三个网站上被称为“Manchester United FC”。我需要将所有可能的变形映射回一个单一名称(“曼彻斯特联”),并为联赛中的 20 支球队(阿森纳、利物浦、曼城等)重复此过程。显然,我不希望有任何错误的匹配[例如将“Man City”映射到“曼彻斯特联”]。
现在,我为所有可能的组合指定正则表达式——例如,“曼彻斯特联”将是“man(chester)?(u|(utd)|(united))(fc)?”;这对于几个网站来说还可以,但变得越来越笨拙。我正在寻找一种可以避免指定这些正则表达式的解决方案。例如,必须有一种方法可以“评分” Man Utd,使其在“曼彻斯特联”中获得高分,但在“利物浦”中获得低分/零分[例如];我会根据所有可能的解决方案测试示例文本,并选择得分最高的那个。
我的感觉是,该解决方案可能类似于神经网络被训练来识别手写字的经典例子[即存在一组固定的可能结果,并且输入样本中存在一定程度的噪声]
有任何想法吗?
谢谢。
回答:
您可以在所涉及的字符串上使用一些相似性度量和手动调整的阈值。或者,阈值也可以通过一些机器学习方法进行训练。哪种特定的相似性度量效果最佳取决于您要匹配的字符串的类型。您可能还需要在将度量应用于字符串之前对其进行预处理(即,删除空格等噪声字符、规范化大小写、解析先前已知的常用缩写等)。
有关不同字符串相似性度量的相当全面的概述和一个 Java 库,请参阅http://www.dcs.shef.ac.uk/~sam/stringmetrics.html