Python:字符串中有多少个相似词?
我有一些看起来很糟糕的字符串,像这样:
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
补充说明:请注意,如果一个词在两个句子中都出现过,那么就认为这个词是共同的——如果想比较位置,可以不进行集合转换(直接对两个句子调用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.intersection
或difflib.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%的单词是相似的。