<p>好问题。</p>
<p>我是SeatGeek的工程师,所以我想我能帮上忙。我们有一个很好的<a href="http://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/" rel="noreferrer">blog post</a>可以很好地解释这些差异,但是我可以总结并提供一些关于如何使用不同类型的见解。</p>
<h2>概述</h2>
<p>在引擎盖下,四个方法中的每一个都计算两个输入字符串中标记的某些顺序之间的编辑距离。这是使用<code>difflib.ratio</code>函数<a href="https://docs.python.org/2/library/difflib.html#difflib.SequenceMatcher.ratio" rel="noreferrer">which will</a>完成的:</p>
<blockquote>
<p>Return a measure of the sequences' similarity (float in [0,1]).</p>
<p>Where T is the total number of elements in both sequences, and M is
the number of matches, this is 2.0*M / T. Note that this is 1 if the
sequences are identical, and 0 if they have nothing in common.</p>
</blockquote>
<p>四个fuzzywuzzy方法对输入字符串的不同组合调用<code>difflib.ratio</code>。</p>
<h2>模糊比率</h2>
<p>很简单。只需对两个输入字符串(<a href="https://github.com/seatgeek/fuzzywuzzy/blob/9a4bc22c7483198fcb96afacc42f5f700fb803ed/fuzzywuzzy/fuzz.py#L43-L55" rel="noreferrer">code</a>)调用<code>difflib.ratio</code>。</p>
<pre><code>fuzz.ratio("NEW YORK METS", "NEW YORK MEATS")
> 96
</code></pre>
<h2>模糊部分比</h2>
<p>尝试解释部分字符串匹配更好。使用最短字符串(长度n)对较大字符串的所有n长度子字符串调用<code>ratio</code>,并返回最高分数(<a href="https://github.com/seatgeek/fuzzywuzzy/blob/9a4bc22c7483198fcb96afacc42f5f700fb803ed/fuzzywuzzy/fuzz.py#L59-L100" rel="noreferrer">code</a>)。</p>
<p>注意这里“洋基”是最短的字符串(长度7),我们用“洋基”与“纽约洋基”长度7的所有子字符串(包括检查“洋基”,100%比赛)的比率:</p>
<pre><code>fuzz.ratio("YANKEES", "NEW YORK YANKEES")
> 60
fuzz.partial_ratio("YANKEES", "NEW YORK YANKEES")
> 100
</code></pre>
<h2>fuzz.token_sort_比率</h2>
<p>试图解释类似字符串的顺序错误。在对每个字符串(<a href="https://github.com/seatgeek/fuzzywuzzy/blob/9a4bc22c7483198fcb96afacc42f5f700fb803ed/fuzzywuzzy/fuzz.py#L120-L133" rel="noreferrer">code</a>)中的标记进行排序后,对两个字符串调用<code>ratio</code>。注意这里的<code>fuzz.ratio</code>和<code>fuzz.partial_ratio</code>都失败了,但是一旦对令牌进行排序,它就100%匹配了:</p>
<pre><code>fuzz.ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.partial_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.token_sort_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 100
</code></pre>
<h2>fuzz.token_set_比率</h2>
<p>试图排除字符串中的差异。调用三个特定子字符串集的比率并返回最大值(<a href="https://github.com/seatgeek/fuzzywuzzy/blob/9a4bc22c7483198fcb96afacc42f5f700fb803ed/fuzzywuzzy/fuzz.py#L149-L200" rel="noreferrer">code</a>):</p>
<ol>
<li>仅与字符串1的剩余部分相交</li>
<li>仅与字符串2的余数相交</li>
<li>一的余数与二的余数相交</li>
</ol>
<p>请注意,通过拆分两个字符串的交集和剩余部分,我们可以同时考虑这两个字符串的相似性和不同性:</p>
<pre><code>fuzz.ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 36
fuzz.partial_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 61
fuzz.token_sort_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 51
fuzz.token_set_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 91
</code></pre>
<h2>应用程序</h2>
<p>这就是魔法发生的地方。在SeatGeek中,本质上我们为每个数据点(地点、事件名称等)创建一个向量分数,并用它来通知特定于我们的问题域的相似性决策。</p>
<p>尽管如此,说实话听起来不像FuzzyWuzzy对您的用例有用。在确定两个地址是否相似时,这将是非常糟糕的。考虑SeatGeek总部的两个可能地址:“235 Park Ave Floor 12”和“235 Park Ave S.Floor 12”:</p>
<pre><code>fuzz.ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 93
fuzz.partial_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 85
fuzz.token_sort_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 95
fuzz.token_set_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 100
</code></pre>
<p>FuzzyWuzzy给了这些字符串很高的匹配分数,但其中一个地址是我们在联合广场附近的实际办公室,另一个地址在Grand Central的另一边。</p>
<p>对于您的问题,最好使用<a href="https://developers.google.com/maps/documentation/geocoding/intro" rel="noreferrer">Google Geocoding API</a>。</p>