Я пытаюсь использовать модуль scipy.hierarchy.cluster для иерархической кластеризации некоторого текста.Я сделал следующее:
l = linkage(model.wv.syn0, method='complete', metric='cosine')
den = dendrogram(
l,
leaf_rotation=0.,
leaf_font_size=16.,
orientation='left',
leaf_label_func=lambda v: str(model.wv.index2word[v])
Функция дендрограммы возвращает dict, содержащий представление дерева, где:
den['ivl']
- список меток, соответствующих листьям:
['politics', 'protest', 'characterfirstvo', 'machine', 'writing', 'learning', 'healthcare', 'climate', 'of', 'rights', 'activism', 'resistance', 'apk', 'week', 'challenge', 'water', 'obamacare', 'colorado', 'change', 'voiceovers', '52', 'acting', 'android']
den['leaves']
- это список позиций каждого листа при обходе листьев слева направо:
[0, 18, 5, 6, 2, 7, 12, 16, 21, 20, 22, 3, 10, 14, 15, 19, 11, 1, 17, 4, 13, 8, 9]
Я знаю, что у Сципи to_tree()
Метод преобразует иерархическую кластеризацию, представленную матрицей связи, в объект дерева, возвращая ссылку на корневой узел (объект ClusterNode) - но я не уверен, насколько этот корневой узел соответствует моим листьям / меткам.Например, идентификаторы, возвращаемые методом get_id()
в этом случае: root = 44, left = 41, right = 43
:
rootnode, nodelist = to_tree(l, rd=True)
rootID = rootnode.get_id()
leftID = rootnode.get_left().get_id()
rightID = rootnode.get_right().get_id()
Мой вопрос, по сути, заключается в том, как я могу пройти по этому дереву и получить соответствующую позицию в den['leaves']
иметка в den['ivl']
для каждого ClusterNode?
Заранее благодарен за любую помощь!
Для справки, это матрица связи l:
[[20. 22. 0.72081252 2. ]
[12. 16. 0.78620636 2. ]
[ 3. 10. 0.79635815 2. ]
[ 0. 18. 0.80193474 2. ]
[15. 19. 0.82297097 2. ]
[ 2. 7. 0.84152483 2. ]
[ 1. 17. 0.84453892 2. ]
[ 4. 13. 0.86098654 2. ]
[ 8. 9. 0.88163748 2. ]
[14. 27. 0.91252009 3. ]
[11. 29. 0.92034739 3. ]
[21. 23. 0.92406542 3. ]
[ 5. 6. 0.93213108 2. ]
[25. 32. 0.98555722 5. ]
[26. 35. 0.99214198 4. ]
[30. 31. 1.05624908 4. ]
[24. 34. 1.0606247 5. ]
[28. 39. 1.06322889 7. ]
[37. 40. 1.1455562 11. ]
[33. 38. 1.15171714 7. ]
[36. 42. 1.17330334 12. ]
[41. 43. 1.25056073 23. ]]