Python:字符串中有多少个相似的单词?

3

我有一些类似于这些的丑陋字符:

   string1 = 'Fantini, Rauch, C.Straus, Priuli, Bertali: 'Festival Mass at the Imperial Court of Vienna, 1648' (Yorkshire Bach Choir & Baroque Soloists + Baroque Brass of London/Seymour)'
   string2 = 'Vinci, Leonardo {c.1690-1730}: Arias from Semiramide Riconosciuta, Didone Abbandonata, La Caduta dei Decemviri, Lo Cecato Fauzo, La Festa de Bacco, Catone in Utica. (Maria Angeles Peters sop. w.M.Carraro conducting)'

我希望能够得到一个关于编程的库或算法,它可以给出两个文本有多少词汇相同的百分比,并且不计算特殊字符,如','':'''''{'等。我知道Levenshtein算法,但是该算法只能比较相似的字符数量,而我想比较它们有多少单词相同。

Levenshtein算法适用于任何两个可比较对象序列...换句话说,只要a[i] == b[j]有定义且有意义。 - John Machin
3个回答

7

正则表达式可以轻松地给出所有单词:

import re
s1 = "Fantini, Rauch, C.Straus, Priuli, Bertali: 'Festival Mass at the Imperial Court of Vienna, 1648' (Yorkshire Bach Choir & Baroque Soloists + Baroque Brass of London/Seymour)"
s2 = "Vinci, Leonardo {c.1690-1730}: Arias from Semiramide Riconosciuta, Didone Abbandonata, La Caduta dei Decemviri, Lo Cecato Fauzo, La Festa de Bacco, Catone in Utica. (Maria Angeles Peters sop. w.M.Carraro conducting)"
s1w = re.findall('\w+', s1.lower())
s2w = re.findall('\w+', s2.lower())
< p > collections.Counter(Python 2.7+)可以快速计算单词出现的次数。

from collections import Counter
s1cnt = Counter(s1w)
s2cnt = Counter(s2w)

可以通过set.intersectiondifflib.SequenceMatcher进行一个非常简单的比较,但是看起来您想要实现一个处理单词的Levenshtein算法,您可以使用这两个列表。

common = set(s1w).intersection(s2w) 
# returns set(['c'])

import difflib
common_ratio = difflib.SequenceMatcher(None, s1w, s2w).ratio()
print '%.1f%% of words common.' % (100*common_ratio)

打印: 相似单词占总单词数的3.4%。


+1 主要是针对 collections.Counter - 另一个 stdlib 中隐藏的宝石。不幸的是,它只适用于 2.7 版本。 - user395760

2
n = 0
words1 = set(sentence1.split())
for word in sentence2.split():
    # strip some chars here, e.g. as in [1]
    if word in words1:
        n += 1

(1: 如何使用Python从字符串中删除符号?)

备注:请注意,如果单词在两个句子中任意位置出现,则此方法将认为该单词在两个句子中均为常见单词。如果需要比较单词在句子中的位置,可以省略set转换(只需对两个句子调用split()函数),使用类似以下的代码:

n = 0
for word_from_1, word_from_2 in zip(sentence1.split(), sentence2.split()):
    # strip some chars here, e.g. as in [1]
    if word_from_1 == word_from_2:
        n += 1

什么?这只使用内置函数,而无需导入任何内容。 - user395760

2
莱文斯坦算法本身不仅限于比较字符,它可以比较任意对象。经典形式使用字符只是一种实现细节,它们可以是任何可以进行相等比较的符号或构造物。

在Python中,将字符串转换为单词列表,然后对列表应用该算法。也许其他人可以帮助您清理不需要的字符,可能使用一些正则表达式技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接