我有一个应用程序可以从网络上的不同来源搜索足球结果。球队名称在不同的网站上并不一致 - 例如曼联在一个网站上可能被称为“曼联”,第二个是“曼联”,第三个是“曼联足球俱乐部”。我需要将所有可能的派生映射回一个名称('曼联'),并为联盟中的20支球队(阿森纳,利物浦,曼城等)重复这一过程。显然我不想要任何糟糕的比赛[例如'曼城'被映射到'曼联']。
现在我为所有可能的组合指定正则表达式 - 例如'曼联'将是'man(chester)?(u |(utd)|(联合))(fc)?';对于几个网站来说这很好,但是越来越笨重。我正在寻找一种避免必须指定这些正则表达式的解决方案。例如,必须有一种方法可以让“曼联”得分,所以它对“曼联”得分较高,但对“利物浦”的得分较低/为零[例如];我会根据所有可能的解决方案测试示例文本,然后选择得分最高的文本。
我的感觉是,解决方案可能类似于经过训练来识别手写的神经网络的经典示例[即存在一组固定的可能结果,并且输入样本中存在一定程度的噪声]
有人有什么想法吗?
感谢。
答案 0 :(得分:1)
看来你正在屏幕抓取相同的来源。
假设您的来源在命名团队方面一致,字符串转换将是最有效的解决方案。
Man Utd - >曼彻斯特联队
曼联足球俱乐部 - >曼彻斯特联队
答案 1 :(得分:1)
我已经在Python中解决了这个确切的问题,但没有任何复杂的AI。我只有一个文本文件,将不同的变体映射到名称的规范形式。没有那么多的变化,一旦你列举了它们,它们很少会改变。
我的文件看起来像这样:
man city=Manchester City
man united=Manchester United
man utd=Manchester United
manchester c=Manchester City
manchester utd=Manchester United
我将这些别名加载到字典对象中,然后当我有一个要映射的名称时,我将其转换为小写(以避免任何大写不同的问题),然后在字典中查找。
如果您知道应该有多少个团队,您还可以添加一个检查,以警告您是否找到了比您预期更多的不同名称。
答案 2 :(得分:0)
您可以对所涉及的字符串使用一些相似性度量标准,并使用手动调整阈值。或者,也可以通过一些机器学习方法来训练阈值。哪种特定的相似性指标最有效取决于您想要匹配的字符串类型。您可能还需要在对它们应用度量之前预处理字符串(即删除诸如空格等的噪声字符,规范化大小写,解决以前已知的常用缩写,...)
有关不同字符串相似性度量和Java库的全面概述,请参阅http://www.dcs.shef.ac.uk/~sam/stringmetrics.html
答案 3 :(得分:0)
您可能还想对文本进行一些结构分析。一个词性分析器可能会暗示哪些单词被用作专有名词,为你提供额外的线索,“mn au”是“Man U”由沮丧的手指匆匆的人打字 - 没有正则表达式会发生什么弄清楚。
能够“训练”软件也可能是最好的 - 在找到它们时添加特定的拼写。
解析自然语言很难!祝你好运!