假设我有一个固定的多单词名称列表,如:
Water
Tocopherol (Vitamin E)
Vitamin D
PEG-60 Hydrogenated Castor Oil
我想要以下输入/输出结果:
Water, PEG-60 Hydrogenated Castor Oil
->Water
,PEG-60 Hydrogenated Castor Oil
PEG-60 Hydrnated Castor Oil
->PEG-60 Hydrogenated Castor Oil
wter PEG-60 Hydrnated Castor Oil
->Water
,PEG-60 Hydrogenated Castor Oil
Vitamin E
->Tocopherol (Vitamin E)
我需要它的性能和能力,认识到要么有太多的密切比赛,没有密切的比赛。使用1比较容易,因为我可以用逗号分隔。大多数情况下,输入列表是用逗号分隔的,因此80%的情况下都可以这样做,但即使这样也有一个小问题。以4为例。一旦分开,大多数拼写检查库都不会返回4的理想匹配(我尝试了一个数字),因为到Vitamin D
的编辑距离要小得多。有一些网站做得很好,但我不知道怎么做
这个问题的第二部分是,如何在上面进行分词。假设给定的列表没有逗号,我需要能够识别它。最简单的例子是Water Vtamin D
应该变成Water
,Vitamin D
。我可以举很多例子,但我认为这是一个很好的问题
Here's可以使用的名称列表
上下文
这是approximate string matching或fuzzy matching的情况。这方面有很好的资料和图书馆
有不同的库和方法来涵盖这一点。我将仅限于相对简单的库
一些很酷的库:
第一部分
让我们把数据放在一起玩。我试着复制上面的例子,希望它是好的
从上面我们有了问题的陈述:我们有一些原始的措辞,并希望改变它
对我们来说,哪些是正确的选择:
这些功能将帮助我们。我尽量把它们记录好
让我们应用到数据帧:
让我们通过比较列来检查结果
如您所见,解决方案在这四种情况下都有效
第二部分
问题解决方案示例: 你有
Water Vtamin D
应该变成Water, Vitamin D
让我们创建一个有效单词列表
如果列表中的单词是有效的
这是最初需要的。 然而,这些可能会失败一点,特别是当维生素E和D结合使用时
参考资料
我对其他答案进行了扩展,使其在提供的列表中起作用。这是一种使用
fuzzywuzzy
的算法,似乎适用于类似vitamin e
的情况这个答案建立在@Rafaels answer的基础上
模糊模糊中的
process.extractOne
默认情况下使用记分器fuzz.WRatio
。这是FuzzyWuzzy提供的多个记分器的组合,对于Seatgeek使用的数据集非常有效。所以你可能想和其他得分手一起尝试,看看哪一个对你来说表现最好。但是请注意,使用编辑距离可能很难区分相当多的元素。例如Vitamin E
<-&燃气轮机Vitamin D
只需要一次编辑,即使它们完全不同。同样的行为也发生在甘油醚-7上fuzzyfuzzy的速度相对较慢,因此在处理较大的数据集时,您可能希望使用RapidFuzz(我是作者),它提供类似的算法,但性能更好
process.extractOne
默认情况下预处理输入字符串(小写并用空格替换非字母数字字符)。由于您可能会多次搜索元素,因此有必要提前对可能的选择进行一次预处理,并停用此行为以确保安全:RapidFuzz和FuzzyFuzzy的区别
由于您报告了RapidFuzz和FuzzyFuzzy之间结果的差异,以下是一些可能的原因:
FuzzyWozzy仍将预处理WRatio中的字符串,因此无法停用预处理。我个人认为这是一个糟糕的设计,所以我对它进行了修改,让用户能够停用处理器,这很可能是您在传递
processor=None
时想要实现的相关问题 更多 >
编程相关推荐