Улучшение алгоритма нечеткого соответствия в Python - PullRequest
1 голос
/ 18 февраля 2011

Задание : взять два текстовых файла и вывести 100% совпадений и 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
Я не могу увеличить минимальный процент в Diff слишком сильно, потому что я должен быть в состоянии сопоставить Univ с университетом. Кроме того, я не могу просто убедиться, что первые слова совпадают, потому что некоторые строки начинаются с «The» и должны совпадать со строками, которые исключают «The». Кто-нибудь может указать мне направление, в котором можно было бы выбросить спички, которые технически похожи на 75%, но для человека они не похожи вообще?

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

Я закончил тем, что написал наиболее распространенный сценарий, а затем удалил наиболее распространенные слова.Это значительно улучшило мои результаты, как предложил @ e-sat в своем комментарии.Тем не менее, difflib дал мне лучшие результаты, чем pylevenshtein, поэтому я не могу пометить его ответ как принятый.

0 голосов
/ 18 февраля 2011

Я бы попробовал сравнить строки с помощью такого инструмента, как pylevenshtein .Это позволяет нечеткие сравнения строк.

...