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

3 投票
3 回答
4625 浏览
提问于 2025-04-16 03:14

我有一些看起来很糟糕的字符串,像这样:

   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 算法 的东西。不过这个算法是比较相似的 字符 数量,而我想要比较的是它们有多少个 单词 是相同的。

3 个回答

2

莱文斯坦算法本身并不局限于比较字符,它可以比较任何任意的对象。之所以经典的形式使用字符,只是实现上的一个细节,实际上可以是任何可以进行相等比较的符号或结构。

在Python中,可以把字符串转换成单词列表,然后对这些列表应用这个算法。也许其他人可以帮你处理掉不需要的字符,可能会用到一些正则表达式的技巧。

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去掉字符串中的符号?)

补充说明:请注意,如果一个词在两个句子中都出现过,那么就认为这个词是共同的——如果想比较位置,可以不进行集合转换(直接对两个句子调用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
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())

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%的单词是相似的。

撰写回答