<p>似乎<code>difflib.SequenceMatcher</code>和<code>fuzzywuzzy</code>使用相同的机制来确定相似性。即<a href="https://en.wikipedia.org/wiki/Levenshtein_distance" rel="nofollow noreferrer">Levenshtein Distance</a>,可以有效地概括为“将一个字符串转换为另一个字符串所需的修改次数”。你知道吗</p>
<p>这里,根据<a href="https://planetcalc.com/1721/" rel="nofollow noreferrer">this calculator</a>,<code>'liver neoplasms'</code>和<code>'cancer, liver'</code>之间的Levenshtein距离是13。同时,<code>'liver neoplasms'</code>和<code>'cancer, breast'</code>之间的距离为12-稍小。你知道吗</p>
<p>Levenshtein距离似乎不是解决这个问题的理想方法。你知道吗</p>
<hr/>
<p>在您的情况下,我将尝试使用某种形式的关键字匹配。我对这样做的适当技巧不太了解,但我的直觉是将输入拆分为关键字,将可能的输出拆分为关键字:</p>
<pre><code>input_keywords = 'liver neoplasms'.split()
possibility_keywords = {title: title.split(', ') for title in ('cancer, breast', 'cancer, liver')}
</code></pre>
<p>然后做一些加权匹配(无论哪一组可能的关键字最接近输入的关键字集-你可能需要创造性地找出有效的方法来计算这个)或关键字检测。例如:</p>
<pre><code>def ratio(input_keywords, possibility_keywords):
return sum(
min(
SequenceMatcher(None, inp_kw, poss_kw).ratio() for poss_kw in possibility_keywords
) for inp_kw in input_keywords
)
</code></pre>
<p>粗略地看一眼就发现<a href="https://www.sciencedirect.com/science/article/pii/0167642396000081" rel="nofollow noreferrer">this paper</a>可能是相关的。或者其他答案中提到的余弦相似算法。你知道吗</p>