记录不一致数据集的匹配算法

NSj*_*nas 6 algorithm pattern-matching string-matching

我正在使用大量的产品数据集(约100万).这些产品来自许多不同的来源,因此它们的数据列表不一致.其中一个重大问题是差异产品品牌名称(约17,000个独特品牌).有些品牌需要多达10个差异,需要将它们联系在一起.

问题:


  1. Inconsistant Spacing:Jet Boil VS Jetboil
  2. 标点符号: Granger的VS格兰杰
  3. 噪音词:北脸VS北脸
  4. Taxomonies: Armada VS Armada Skis
  5. 符号: Phil和Teds VS Phil&Teds
  6. 错误拼写: Patagonia VS Pategonia
  7. 其他奇观:贝尔体育VS贝尔体育#81037

示例数据集


Black Diamond
Black Diamond (Uda)
Black Diamond Co
Black Diamond Eq Ltd
Black Diamond Eqp #76800
Black Diamond Equipment
Black Dog Machine Llc
Black Dome Press
Black Dot
Black Dragon
Black Fire
Black Flys
Black Forest Girl
Black Gold
Black Hawk Inc.
Black Hills
Black Knight
Black Label
Black Magic
Black Marine
Black Market Bikes
Black Max
Black Opal
Black Ops
Black Rain Ordance Inc.
Black Rain Ordnance
Black Rapid
Black Ribbon
Black Rifle Disease Engineerin
Black River Bucks
Black Seal
Black Seed
Black Swan
Black Tower
Black Widow
Black's
Run Code Online (Sandbox Code Playgroud)

后果(如评论中所示)

  • 不正确的关联将导致在产品搜索中显示不相关的品牌,从而削弱了表示层的可用性
  • 缺少关联将导致同一品牌在筛选器列表中多次显示,从而削弱了表示层的可用性

我意识到这是一个很大的问题,可能超出了堆栈溢出文章中可以解决的范围,但我正在寻找如何解决这个问题的灵感.

欢迎任何可能有用的算法,软件模式或过程.

Bit*_*ise 3

好吧,我处理这个问题的方法是使用一些距离度量来量化短语之间的相似性,然后根据术语的距离对术语进行聚类。

您可以从经典的文本度量开始,例如编辑距离(您会很容易地找到许多实现),它基本上是编辑距离,或者从一个字符串到另一个字符串所需的操作数量,其中操作可以是替换、插入或删除。

从你给出的例子来看,Levenshtein 似乎是合理的。

对于聚类有大量的算法,同样很容易通过谷歌搜索并找到大量的实现。聚类基本上是找到在一定距离度量下彼此接近的对象组(簇)。在您的情况下,这些将是彼此相似的术语组。

看到结果后,您可以尝试使用您对数据的了解进行手动调整(例如指定“&”接近“and”等),从而稍微调整一下距离度量。

祝你好运!