Список списков кластеризации слов

1

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

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

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

  • 1
    что ты уже испробовал? Как правило, вопросы типа «Как я» считаются не по теме. Этот форум больше предназначен для помощи, когда вы сталкиваетесь с конкретной проблемой.
  • 0
    Может быть, кластеризация sklearn - это место для начала
Показать ещё 2 комментария
Теги:
machine-learning
cluster-analysis
information-retrieval

3 ответа

-2
Лучший ответ

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

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

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

  • 0
    Вы можете тривиально закодировать данные: яблоко - это столбец 0, банан - это столбец 1, ... а затем каждый набор представляет собой двоичный вектор. Это работает, но качество будет плохим по другим причинам (данные слишком грубые).
  • 0
    @ Anony-Mousse Но мне нужно объединить слова, а не наборы. Если я использую этот подход к словам, я получу матрицу смежности, как описано выше. На самом деле, обнаружение сообщества имеет довольно хорошие результаты. Я не понимаю, почему я получаю минус баллы за этот ответ (и без каких-либо комментариев).
Показать ещё 1 комментарий
1

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

Например, вы можете предположить, что 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()])

выход:

[array (['apple', 'banana', 'orange']), array (['potatoes', 'rice'])]

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

  • 0
    Я думал о том, чтобы превратить проблему в граф, но у меня есть тысячи записей, и каждая запись состоит как минимум из 10 слов. Так что может случиться так, что весь граф может быть в одном компоненте. Мне больше нужно кластеризоваться в том смысле, что будут рассматриваться только те слова, которые часто встречаются вместе. Я также думал о поиске полного графика, но мне также нужно учитывать, как часто встречаются комбинации слов.
0

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

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

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

  • 0
    Приведенный выше пример был просто примером. Наборы, конечно, больше (сотни слов), и есть тысячи наборов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню