Расстояние Левенштейна для списка

Я хочу разделить свой список слов на некоторое количество кластеров, используя расстояние Левенштейна.

data = pd.read_csv("data.csv")
Target_Column = data["words"]
Target = Target_Column.tolist()
clusters = defaultdict(list)
threshold =5
numb = range(len(Target))

for i in numb:
    for j in range(i+1, len(numb)):
        if distance(Target[i],Target[j]) <= threshold:
            clusters[i].append(Target[j])
            clusters[j].append(Target[i])

Но поскольку я запускаю цикл по списку, некоторые кластеры повторяются. Пожалуйста, помогите мне решить эту проблему

1 ответ

Если у вас есть только строки, почему бы не использовать набор?

Target = set(Target_Column.tolist())

Вы также можете использовать значение по умолчанию набора для вашего отображения:

clusters = defaultdict(set)

Но это требует изменения list.append в set.add в вашей петле.


Существует, однако, более питонная альтернатива вашему коду.

Я бы, вероятно, сгенерировал бы сопоставление слов со множеством их связей на лету.

Вот пример, предполагая, words это set из всех слов:

clusters = {w1: set(w2 for w2 in words if distance(w1, w2) <= threshold) for w1 in words}

Живой пример:

>>> distance = lambda x, y: abs(len(x) - len(y))
>>> words = set("abc def abcd abcdefghijk abcdefghijklmnopqrstuv".split())
>>> threshold = 3
>>> for cluster, values in clusters.items():
...     print cluster, ": ", ", ".join(values)
...
abcd :  abcd, abc, def
abc :  abcd, abc, def
abcdefghijk :  abcdefghijk
abcdefghijklmnopqrstuv :  abcdefghijklmnopqrstuv
def :  abcd, abc, def

При увеличении порога мы получаем один большой "кластер" для всех слов:

>>> threshold = 100
>>> clusters = {w1: set(w2 for w2 in words if distance(w1, w2) <= threshold) for w1 in words}
>>> for cluster, values in clusters.items():
...     print cluster, ": ", ", ".join(values)
...
abcd :  abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def
abc :  abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def
abcdefghijk :  abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def
abcdefghijklmnopqrstuv :  abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def
def :  abcd, abc, abcdefghijk, abcdefghijklmnopqrstuv, def
Другие вопросы по тегам