кластеризация строк с несколькими словами в каждой строке, предпочитают Левенштейн - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть текстовый файл со строками, в каждой строке есть несколько слов, я хочу сгруппировать их по строкам, а не разделять каждую строку на одно слово. Я написал некоторый код, но вывод странный. мой код:

import numpy as np
import sklearn.cluster
import distance

f = open("names.txt", "r")
words = f.read().split(',')
#for line in f:
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.AffinityPropagation(affinity="precomputed", damping=0.5)
affprop.fit(lev_similarity)
for cluster_id in np.unique(affprop.labels_):
    exemplar = words[affprop.cluster_centers_indices_[cluster_id]]
    cluster = np.unique(words[np.nonzero(affprop.labels_==cluster_id)])
    cluster_str = ", ".join(cluster)
    print(" - *%s:* %s" % (exemplar, cluster_str))

вывод:

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

файл:

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

что здесь не так?

1 Ответ

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

Вам также может понадобиться удалить \n символов. Слово объединяется с символом перевода строки. Вот почему вы видите многострочный вывод.

Вы можете обновить свой код после прочтения файла:

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

original_file
'BRAZEMAX ESTATYS, LTD\nGramkai Books\nBras5emax Estates, L.T.D.\nBOZEMAN Enterprises\nBOZERMAN ENTERPRISES\nNadelman, Jr\nJohn Smith\nPC Adelman\nGramkai, Inc.\nBozeman Enterprises\nMichele LTD\nGramkat, Inc.\nBBAZEMAX ESTATES, LTD\nBOZEMAN Ent.\nGramkat Estates, Inc.'

import re
re.split('[\n,]', original_file)
['BRAZEMAX ESTATYS',
 ' LTD',
 'Gramkai Books',
 'Bras5emax Estates',
 ' L.T.D.',
 'BOZEMAN Enterprises',
 'BOZERMAN ENTERPRISES',
 'Nadelman',
 ' Jr',
 'John Smith',
 'PC Adelman',
 'Gramkai',
 ' Inc.',
 'Bozeman Enterprises',
 'Michele LTD',
 'Gramkat',
 ' Inc.',
 'BBAZEMAX ESTATES',
 ' LTD',
 'BOZEMAN Ent.',
 'Gramkat Estates',
 ' Inc.']
​

Теперь слова разделяются как новой строкой, так и запятыми.

...