Как найти сходство между строками в списках в Python - PullRequest
0 голосов
/ 07 мая 2019

Я сравниваю два столбца данных в Python, чтобы найти для каждого элемента первого столбца наилучшее совпадение со вторым. Первый столбец содержит 19 000 строк, и мне нужно проверить для каждой строки, что является лучшим соответствием второго столбца. Таким образом, необходимо проверить 19 000 строк по 19 000 раз для каждой строки, принимая во внимание, что сама строка должна быть другой, а не той.

Я начал с простого сравнения, нашел строку в списке и добился успеха. Затем я применил его к списку, просто чтобы сравнить их оба, но, очевидно, выдает ошибку «TypeError: ожидаемая строка или байтовоподобный объект» из-за сравнения строки со списком. Наконец, я попытался создать цикл, но ошибка та же. Есть ли способ создать список с ожидаемыми результатами? Может быть, есть лучший способ сделать это с другой библиотекой, но пока я ничего не нашел. Вот код на данный момент:

#simple example
from fuzzywuzzy import process
string = "appl"
compare = ["adfad.","apple","asple","tab"]
Ratios = process.extract(string,compare)
print(Ratios)
[('apple', 89), ('asple', 67), ('tab', 29), ('adfad.', 22)]

highest = process.extractOne(string,compare)
print(highest)
('apple', 89)

#data frame
from fuzzywuzzy import process
dataframecolumn = ["appl","tb"]
compare = ["adfad.","apple","asple","tab"]
Ratios = process.extract(dataframecolumn,compare)
TypeError: expected string or bytes-like object

#expected (but I need a list)
highest = process.extractOne(dataframecolumn[0],compare)
print(highest)
('apple', 89)
highest = process.extractOne(dataframecolumn[1],compare)
print(highest)
('tab', 80)

#Result expected
results = ["apple, 89","tab, 80"]

#Error
myl = ["appl","tb"]
compare = ["adfad.","apple","asple","tab"]
results = []
for x in myl:
    results.append(process.extractOne(myl,compare)[1])
TypeError: expected string or bytes-like object

1 Ответ

1 голос
/ 07 мая 2019
from operator import itemgetter 

dataframecolumn = ["appl","tb"]
compare = ["adfad.","apple","asple","tab"]
Ratios = [process.extract(x,compare) for x in dataframecolumn]
print ([max(ratios, key = itemgetter(1)) for ratios in Ratios])

# Or oneliner
#Ratios = [max(process.extract(x,compare),key = itemgetter(1)) for x in dataframecolumn]

Если extract всегда будет возвращать отсортированные результаты, тогда мы можем избежать вызова max

Ratios = [process.extract(x, compare)[0] for x in dataframecolumn]

Выход:

[('apple', 89), ('tab', 80)]

Если вы хотите пропустить точные совпадения и получить только нечеткие совпадения, просто пропустите совпадения со счетом 100% и получите первое не 100% совпадение, поскольку оно уже отсортировано.

dataframecolumn = ["apple","tb"]
compare = ["adfad","apple","asple","tab"]
Ratios = [process.extract(x,compare) for x in dataframecolumn]
result = list()
for ratio in Ratios:
    for match in ratio:
        if match[1] != 100:
            result.append(match)
            break
print (result) 
...