кластеризация большого файла на 3 группы с левенахтейном - PullRequest
1 голос
/ 23 февраля 2020

Привет, у меня есть маленький файл и большой файл, код здесь даже не работает для большого файла, только для маленького файла, так как я могу читать и выполнять действия с большим файлом? когда я читаю и пытаюсь сгруппировать в один l oop, это не работает, потому что каждая итерация только в строке. Здесь проблема с маленьким файлом: файл строк, и мне нужно разбить их на 3 группы. Я пробовал распространение сродства, но он не получает параметр размера группы, он дает мне 4 группы, в то время как у 4-й группы есть только одно слово, которое очень близко к другой группе:

0
 - *Bras5emax Estates, L.T.D.
:* Bras5emax Estates, L.T.D.

1
 - *BOZEMAN Enterprises
:* BBAZEMAX ESTATES, LTD
, BOZEMAN Ent.
, BOZEMAN Enterprises
, BOZERMAN ENTERPRISES
, BRAZEMAX ESTATYS, LTD
, Bozeman Enterprises

2
 - *PC Adelman
:* John Smith
, Michele LTD
, Nadelman, Jr
, PC Adelman

3
 - *Gramkai, Inc.
:* Gramkai Books
, Gramkai, Inc.
, Gramkat Estates, Inc., Gramkat, Inc.

, тогда я попробовал K-MEANS но результат:

0
 - *Gramkai Books
, Gramkai, Inc.
, Gramkat Estates, Inc., Gramkat, Inc.
:*
1
 - *BBAZEMAX ESTATES, LTD
, BOZEMAN Enterprises
, BOZERMAN ENTERPRISES
, BRAZEMAX ESTATYS, LTD
, Bozeman Enterprises
, Bras5emax Estates, L.T.D.
:*
2
 - *BOZEMAN Ent.
, John Smith
, Michele LTD
, Nadelman, Jr
, PC Adelman
:*

, как вы можете видеть BOZEMAN Ent. находится в группе 2 вместо группы 1.

мой вопрос: есть ли способ улучшить сцепление? и есть ли cluster_center в K-MEANS?

код:

import numpy as np
import sklearn.cluster
import distance

f = open("names.txt", "r")
words = f.readlines()
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in words])
affprop = sklearn.cluster.KMeans(n_clusters=3)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    print(cluster_id)
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:*" % ( cluster_str))

1 Ответ

0 голосов
/ 23 февраля 2020

Кластеризация заданных текстовых имен (предприятий) может быть улучшена несколькими способами.

  1. Внесите некоторую очистку текста и знание предметной области, удалив, например, точки, обычные корпоративные стоп-слова и символы понижения:
words = [re.sub(r"(,|\.|ltd|l\.t\.d|inc|estates|enterprises|ent|estatys)","", w.lower()).strip() for w in words]
Используйте «нормализованную» версию distance.levenshtein, чтобы расстояния можно было значительно сравнить, например:
distance.nlevenshtein("abc", "acd", method=1)  # shortest alignment
distance.nlevenshtein("abc", "acd", method=2)  # longest alignment
Попробуйте другие меры расстояний: sorensen или jaccard, которые уже нормализованы.

Ниже приведен полный пример кода:

words = \
["Gramkai Books",
"Gramkai, Inc.",
"Gramkat Estates, Inc.",
"Gramkat, Inc.",
"BBAZEMAX ESTATES, LTD",
"BOZEMAN Enterprises",
"BOZERMAN ENTERPRISES",
"BRAZEMAX ESTATYS, LTD",
"Bozeman Enterprises",
"Bras5emax Estates, L.T.D.",
"BOZEMAN Ent.",
"John Smith",
"Michele LTD",
"Nadelman, Jr",
"PC Adelman"]

import re
import sklearn
from sklearn import cluster
words = [re.sub(r"(,|\.|ltd|l\.t\.d|inc|estates|enterprises|ent|estatys)","", w.lower()).strip() for w in words]
words = np.asarray(words) #So that indexing with a list will work
lev_similarity = -1*np.array([[distance.nlevenshtein(w1,w2,method = 1) for w1 in words] for w2 in words])
affprop = sklearn.cluster.KMeans(n_clusters=3)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    print(cluster_id)
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:*" % ( cluster_str))

Результат:

0
 - *john smith, michele, nadelman jr, pc adelman:*
1
 - *bbazemax, bozeman, bozerman, bras5emax, brazemax:*
2
 - *gramkai, gramkai books, gramkat:*

Наконец, вам может потребоваться объединить измененные имена с оригинальными именами.

...