Список списков кластеризации слов - PullRequest
0 голосов
/ 11 октября 2018

Допустим, у меня есть список списков слов, например

[['apple','banana'],
 ['apple','orange'],
 ['banana','orange'],
 ['rice','potatoes','orange'],
 ['potatoes','rice']]

Набор намного больше.Я хочу сгруппировать слова, чтобы слова, обычно существующие вместе, имели один и тот же кластер.Таким образом, в этом случае кластеры будут ['apple', 'banana', 'orange'] и ['rice','potatoes'].
Каков наилучший подход к архивированию такого рода кластеризации?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Итак, после многих поисков в Google, я понял, что на самом деле я не могу использовать методы кластеризации, потому что мне не хватает функциональных переменных, по которым я могу кластеризовать слова.Если я составлю таблицу, в которой отмечу, как часто каждое слово встречается с другими словами (на самом деле декартово произведение), то на самом деле это матрица смежности, и кластеризация на ней не работает.

Итак, решение, которое я искалэто обнаружение сообщества графов.Я использовал библиотеку igraph (или оболочку python-ipgraph) для поиска кластеров, и она работает очень хорошо и быстро.

Дополнительная информация:

0 голосов
/ 25 октября 2018

Вместо этого будет более целесообразно искать частые наборы элементов .

Если вы кластеризуете такие короткие наборы слов, все будет соединено, как правило, простонесколько уровней: ничего общего, один общий элемент, два общих элемента.Это слишком грубо, чтобы использовать его для кластеризации.Вы подключите все или ничего, и результаты могут быть очень чувствительны к изменениям и порядку данных.

Так что отказались от парадигмы разделения данных - вместо этого ищите частые комбинации.

0 голосов
/ 11 октября 2018

Я думаю, что более естественно думать о проблеме как о графике.

Можно предположить, например, что apple - это узел 0, а banana - это узел 1, и первый список указывает, что между 0 и 1 есть грань.

, поэтому сначала преобразуйтеметки в числа:

from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
le.fit(['apple','banana','orange','rice','potatoes'])

сейчас:

l=[['apple','banana'],
 ['apple','orange'],
 ['banana','orange'],
 ['rice','potatoes'], #I deleted orange as edge is between 2 points, you can  transform the triple to 3 pairs or think of different solution
 ['potatoes','rice']]

конвертируйте метки в числа:

edges=[le.transform(x) for x in l]

>>edges

[array([0, 1], dtype=int64),
array([0, 2], dtype=int64),
array([1, 2], dtype=int64),
array([4, 3], dtype=int64),
array([3, 4], dtype=int64)]

сейчас, начните строить график и добавлять ребра:

import networkx as nx #graphs package
G=nx.Graph() #create the graph and add edges
for e in edges:
    G.add_edge(e[0],e[1])

теперь вы можете использовать функцию connected_component_subgraphs для анализа связанных вершин.

components = nx.connected_component_subgraphs(G) #analyze connected subgraphs
comp_dict = {idx: comp.nodes() for idx, comp in enumerate(components)}
print(comp_dict)

выход:

{0: [0, 1, 2], 1: [3, 4]}

или

print([le.inverse_transform(v) for v in comp_dict.values()])

вывод:

[массив (['яблоко', 'банан', 'апельсин']), массив (['картофель', 'рис'])]

и те,ваши 2 кластера.

...