优化Python中的模糊匹配算法

1 投票
2 回答
1555 浏览
提问于 2025-04-16 12:04

任务: 处理两个文本文件,找出完全相同的内容和相似度达到75%的内容。

解决方案:

import difflib
import csv

# Imports and parses the files
fileA = open("H:/comm.names.txt", 'r')
try:
        setA = fileA.readlines()
finally:    
        fileA.close()

fileB = open("H:/acad.names.txt", 'r')
try:
        setB = fileB.readlines()
finally:    
        fileB.close()

# 100% Match
setMatch100 = set(setA).intersection(setB)

Match100 = open("H:\Match100.txt", 'w')
try:
    for item in setMatch100:
        Match100.write(item)
finally:
    Match100.close()

# Remove 100% matches from the two lists
setA_LeftOver = set(setA).difference(setMatch100)
setB_LeftOver = set(setB).difference(setMatch100)

#Return the best match for setA_LeftOver[i] in setB_LeftOver that is at least 75% matching.
fMatch75 = open("H:\Match75.csv", 'w')
Match75 = csv.writer(fMatch75)
try:
    Match75.writerow(['File A', 'File B'])
    for item in setA_LeftOver:
                match = difflib.get_close_matches(item, setB_LeftOver, 1, 0.75)
                if len(match) > 0:
                        row = [item.rstrip(), match[0].rstrip()]
                        Match75.writerow(row)


finally:
    fMatch75.close()

问题: 这个方法可以用,但结果并不好。举个例子,这里有一个匹配的情况:

Fovea Pharmaceuticals SA Kobe Pharmaceutical Univ
我不能把相似度的最低百分比调得太高,因为我需要能够把“Univ”和“University”匹配上。此外,我不能只确保第一个单词匹配,因为有些字符串是以“The”开头的,而需要与不包含“The”的字符串匹配。有没有人能给我一些建议,如何排除那些在技术上看起来75%相似,但对人来说根本不相似的匹配呢?

2 个回答

0

我建议你可以试试用一个叫 pylevenshtein 的工具来比较字符串。这个工具可以进行模糊字符串比较,也就是说它可以找出相似但不完全相同的字符串。

0

我写了一个脚本,用来找出最常用的单词,然后把这些常用单词去掉。这样做让我得到的结果大大改善,就像@e-satis在评论里提到的那样。不过,使用difflib的效果比pylevenshtein要好,所以我不能把他的回答标记为最佳答案。

撰写回答