From 79e31e48a08ad4b0ac7f0f7c01d23be701d81a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 23 Jul 2024 13:38:12 +0200 Subject: [PATCH 01/21] Added implementation of multiplicative update weighted NMF --- turftopic/models/wnmf.py | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 turftopic/models/wnmf.py diff --git a/turftopic/models/wnmf.py b/turftopic/models/wnmf.py new file mode 100644 index 0000000..8a4304c --- /dev/null +++ b/turftopic/models/wnmf.py @@ -0,0 +1,48 @@ +import numpy as np +from sklearn.decomposition._nmf import _beta_divergence, _initialize_nmf +from sklearn.utils.extmath import safe_sparse_dot + +EPSILON = np.finfo(np.float32).eps + + +def weighted_nmf( + dtm: np.ndarray, + weight: np.ndarray, + n_components: int, + seed: int, + max_iter: int = 200, + tol: float = 1e-4, +) -> tuple[np.ndarray, np.ndarray]: + """Multiplicative Update algorithm for a special case of weighted NMF, where + only the rows are weighted, but not the individual elements in the data matrix.""" + doc_topic_matrix, components = _initialize_nmf( + dtm, n_components, random_state=seed + ) + U = components.T + V = doc_topic_matrix.T + weighted_A = dtm.T.multiply(weight) # .T + prev_error = np.inf + for i in range(0, max_iter): + # Update V + numerator = safe_sparse_dot(U.T, weighted_A) + denominator = np.linalg.multi_dot((U.T, U, V * weight)) + denominator[denominator <= 0] = EPSILON + delta = numerator + delta /= denominator + delta[np.isinf(delta) & (V == 0)] = 0 + V *= delta + # Update U + numerator = safe_sparse_dot(weighted_A, V.T) + denominator = np.linalg.multi_dot((U, V * weight, V.T)) + denominator[denominator <= 0] = EPSILON + delta = numerator + delta /= denominator + delta[np.isinf(delta) & (U == 0)] = 0 + U *= delta + if (tol > 0) and (i % 10 == 0): + error = _beta_divergence(dtm, V.T, U.T, 2) + if (error - prev_error) > tol: + break + prev_error = error + components, doc_topic_matrix = U.T, V.T + return components, doc_topic_matrix From ccb8c22d723d5caf7147c1e8126ba137bb2a065d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 23 Jul 2024 13:38:36 +0200 Subject: [PATCH 02/21] Added basic implementation of topic hierarchies --- turftopic/hierarchical.py | 226 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 turftopic/hierarchical.py diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py new file mode 100644 index 0000000..19a9e37 --- /dev/null +++ b/turftopic/hierarchical.py @@ -0,0 +1,226 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Optional + +import numpy as np +from rich.console import Console +from rich.table import Table +from rich.tree import Tree + +from turftopic.base import ContextualModel +from turftopic.utils import export_table + + +def _build_tree(h: TopicHierarchy, tree: Tree, top_k: int): + names = h._topic_desc(top_k) + if h.subtopics is None: + for name in names: + tree.add(name) + return + for name, sub in zip(names, h.subtopics): + branch = tree.add(name) + _build_tree(sub, branch, top_k) + + +@dataclass +class TopicHierarchy: + model: ContextualModel + components_: np.ndarray + document_topic_matrix: np.ndarray + subtopics: Optional[list[TopicHierarchy]] = None + + def __getitem__(self, index: int): + return self.subtopics[index] + + def get_topics( + self, top_k: int = 10 + ) -> list[tuple[Any, list[tuple[str, float]]]]: + """Returns high-level topic representations in form of the top K words + in each topic. + + Parameters + ---------- + top_k: int, default 10 + Number of top words to return for each topic. + + Returns + ------- + list[tuple] + List of topics. Each topic is a tuple of + topic ID and the top k words. + Top k words are a list of (word, word_importance) pairs. + """ + n_topics = self.components_.shape[0] + try: + classes = self.model.classes_ + except AttributeError: + classes = list(range(n_topics)) + highest = np.argpartition(-self.components_, top_k)[:, :top_k] + vocab = self.model.get_vocab() + top = [] + score = [] + for component, high in zip(self.components_, highest): + importance = component[high] + high = high[np.argsort(-importance)] + score.append(component[high]) + top.append(vocab[high]) + topics = [] + for topic, words, scores in zip(classes, top, score): + topic_data = (topic, list(zip(words, scores))) + topics.append(topic_data) + return topics + + @property + def topic_names(self) -> list[str]: + """Names of the topics based on the highest scoring 4 terms.""" + topic_desc = self.get_topics(top_k=4) + names = [] + for topic_id, terms in topic_desc: + concat_words = "_".join([word for word, importance in terms]) + names.append(f"{topic_id}_{concat_words}") + return names + + def _topic_desc(self, top_k: int = 10) -> str: + topic_desc = self.get_topics(top_k=top_k) + names = [] + for topic_id, terms in topic_desc: + concat_words = ", ".join([word for word, importance in terms]) + names.append(f"{topic_id}: {concat_words}") + return names + + def print_tree(self, top_k: int = 10): + """Prints tree of hierarchical topics. + + Parameters + ---------- + top_k: int, default 10 + Number of top words to describe topics with. + """ + tree = Tree("Topic Hierarchy:") + _build_tree(self, tree, top_k) + console = Console() + console.print(tree) + + def _topics_table( + self, + top_k: int = 10, + show_scores: bool = False, + show_negative: bool = False, + ) -> list[list[str]]: + columns = ["Topic ID", "Highest Ranking"] + if show_negative: + columns.append("Lowest Ranking") + rows = [] + try: + classes = self.model.classes_ + except AttributeError: + classes = list(range(self.components_.shape[0])) + vocab = self.model.get_vocab() + for topic_id, component in zip(classes, self.components_): + highest = np.argpartition(-component, top_k)[:top_k] + highest = highest[np.argsort(-component[highest])] + lowest = np.argpartition(component, top_k)[:top_k] + lowest = lowest[np.argsort(component[lowest])] + if show_scores: + concat_positive = ", ".join( + [ + f"{word}({importance:.2f})" + for word, importance in zip( + vocab[highest], component[highest] + ) + ] + ) + concat_negative = ", ".join( + [ + f"{word}({importance:.2f})" + for word, importance in zip( + vocab[lowest], component[lowest] + ) + ] + ) + else: + concat_positive = ", ".join([word for word in vocab[highest]]) + concat_negative = ", ".join([word for word in vocab[lowest]]) + row = [f"{topic_id}", f"{concat_positive}"] + if show_negative: + row.append(concat_negative) + rows.append(row) + return [columns, *rows] + + def print_topics( + self, + top_k: int = 10, + show_scores: bool = False, + show_negative: bool = False, + ): + """Pretty prints topics at the current level of the hierarchy. + + Parameters + ---------- + top_k: int, default 10 + Number of top words to return for each topic. + show_scores: bool, default False + Indicates whether to show importance scores for each word. + show_negative: bool, default False + Indicates whether the most negative terms should also be displayed. + """ + columns, *rows = self._topics_table(top_k, show_scores, show_negative) + table = Table(show_lines=True) + table.add_column("Topic ID", style="blue", justify="right") + table.add_column( + "Highest Ranking", + justify="left", + style="magenta", + max_width=100, + ) + if show_negative: + table.add_column( + "Lowest Ranking", + justify="left", + style="red", + max_width=100, + ) + for row in rows: + table.add_row(*row) + console = Console() + console.print(table) + + def export_topics( + self, + top_k: int = 10, + show_scores: bool = False, + show_negative: bool = False, + format: str = "csv", + ) -> str: + """Exports top K words from topics in a table in a given format. + Returns table as a pure string. + + Parameters + ---------- + top_k: int, default 10 + Number of top words to return for each topic. + show_scores: bool, default False + Indicates whether to show importance scores for each word. + show_negative: bool, default False + Indicates whether the most negative terms should also be displayed. + format: 'csv', 'latex' or 'markdown' + Specifies which format should be used. + 'csv', 'latex' and 'markdown' are supported. + """ + table = self._topics_table( + top_k, show_scores, show_negative=show_negative + ) + return export_table(table, format=format) + + def add_level(self, n_subtopics: int, **kwargs): + """Adds level to hierarchy based on the topics on this level. + + Parameters + ---------- + n_subtopics: int + Number of subtopics to add for each topic on this level. + """ + self.subtopics = self.model.calculate_subtopics( + hierarchy=self, n_subtopics=n_subtopics, **kwargs + ) From 4128595186accbfd9d821d406834238c9ba45321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 23 Jul 2024 13:38:55 +0200 Subject: [PATCH 03/21] Added hierarchy to KeyNMF --- turftopic/models/keynmf.py | 76 +++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/turftopic/models/keynmf.py b/turftopic/models/keynmf.py index 8d6bebc..3f2d396 100644 --- a/turftopic/models/keynmf.py +++ b/turftopic/models/keynmf.py @@ -2,6 +2,7 @@ from typing import Optional, Union import numpy as np +import scipy.sparse as spr from rich.console import Console from sentence_transformers import SentenceTransformer from sklearn.exceptions import NotFittedError @@ -10,7 +11,10 @@ from turftopic.base import ContextualModel, Encoder from turftopic.data import TopicData from turftopic.dynamic import DynamicTopicModel +from turftopic.hierarchical import TopicHierarchy from turftopic.models._keynmf import KeywordExtractor, KeywordNMF +from turftopic.models.wnmf import weighted_nmf +from turftopic.vectorizer import default_vectorizer class KeyNMF(ContextualModel, DynamicTopicModel): @@ -62,7 +66,7 @@ def __init__( else: self.encoder_ = encoder if vectorizer is None: - self.vectorizer = CountVectorizer() + self.vectorizer = default_vectorizer() else: self.vectorizer = vectorizer self.model = KeywordNMF( @@ -92,6 +96,58 @@ def extract_keywords( batch_or_document, embeddings=embeddings ) + def vectorize( + self, + raw_documents=None, + embeddings: Optional[np.ndarray] = None, + keywords: Optional[list[dict[str, float]]] = None, + ) -> spr.csr_array: + """Creates document-term-matrix from documents.""" + if keywords is None: + keywords = self.extract_keywords( + raw_documents, embeddings=embeddings + ) + return self.model.vectorize(keywords) + + def calculate_subtopics( + self, + hierarchy: TopicHierarchy, + n_subtopics: int, + keywords: Optional[list[dict[str, float]]] = None, + document_term_matrix: Optional[np.ndarray] = None, + ) -> list[TopicHierarchy]: + document_term_matrix = getattr( + self, "document_term_matrix", document_term_matrix + ) + if (document_term_matrix is None) and (keywords is not None): + document_term_matrix = self.vectorize(keywords) + if document_term_matrix is None: + raise ValueError( + "document_term_matrix is needed for computing hierarchies. Perhaps you fitted the model online?" + ) + dtm = document_term_matrix + N = dtm.shape[0] + subtopics = [] + for topic_importance, base_component in zip( + hierarchy.document_topic_matrix.T, hierarchy.components_ + ): + weight = topic_importance + subcomponents, sub_doc_topic = weighted_nmf( + dtm, weight, n_subtopics, self.random_state, max_iter=200 + ) + subcomponents = subcomponents * np.log( + 1 + subcomponents.mean() / (subcomponents.sum(axis=0) + 1) + ) + subtopics.append( + TopicHierarchy( + self, + components_=subcomponents, + document_topic_matrix=sub_doc_topic, + subtopics=None, + ) + ) + return subtopics + def fit_transform( self, raw_documents=None, @@ -130,6 +186,14 @@ def fit_transform( doc_topic_matrix = self.model.fit_transform(keywords) self.components_ = self.model.components console.log("Model fitting done.") + self.document_topic_matrix = doc_topic_matrix + self.document_term_matrix = self.model.vectorize(keywords) + self.hierarchy = TopicHierarchy( + self, + components_=self.components_, + document_topic_matrix=self.document_topic_matrix, + subtopics=None, + ) return doc_topic_matrix def fit( @@ -247,6 +311,14 @@ def prepare_topic_data( self.components_ = self.model.components console.log("Model fitting done.") document_term_matrix = self.model.vectorize(keywords) + self.document_topic_matrix = doc_topic_matrix + self.document_term_matrix = self.document_term_matrix + self.hierarchy = TopicHierarchy( + self, + components_=self.components_, + document_topic_matrix=self.document_topic_matrix, + subtopics=None, + ) res: TopicData = { "corpus": corpus, "document_term_matrix": document_term_matrix, @@ -291,6 +363,8 @@ def fit_transform_dynamic( ).T self.temporal_components_ = self.model.temporal_components self.components_ = self.model.components + self.document_topic_matrix = doc_topic_matrix + self.document_term_matrix = self.model.vectorize(keywords) return doc_topic_matrix def partial_fit_dynamic( From 8fbf0d7cf9cd51f2b41626eff477e8c0558a8446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 23 Jul 2024 14:03:44 +0200 Subject: [PATCH 04/21] Added pretty printing and repr to hierarchy --- turftopic/hierarchical.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py index 19a9e37..efb0a7e 100644 --- a/turftopic/hierarchical.py +++ b/turftopic/hierarchical.py @@ -12,15 +12,29 @@ from turftopic.utils import export_table -def _build_tree(h: TopicHierarchy, tree: Tree, top_k: int): - names = h._topic_desc(top_k) +def _build_tree(h: TopicHierarchy, tree: Tree, top_k: int, level=0): + names = h._topic_desc(top_k, level=level) if h.subtopics is None: for name in names: tree.add(name) return for name, sub in zip(names, h.subtopics): branch = tree.add(name) - _build_tree(sub, branch, top_k) + _build_tree(sub, branch, top_k, level=level + 1) + + +COLOR_PER_LEVEL = [ + "bright_blue", + "bright_magenta", + "bright_cyan", + "bright_green", + "bright_red", + "bright_yellow", + "cyan", + "magenta", + "blue", + "white", +] @dataclass @@ -81,12 +95,15 @@ def topic_names(self) -> list[str]: names.append(f"{topic_id}_{concat_words}") return names - def _topic_desc(self, top_k: int = 10) -> str: + def _topic_desc(self, top_k: int = 10, level=0) -> str: topic_desc = self.get_topics(top_k=top_k) names = [] + color = COLOR_PER_LEVEL[min(level, len(COLOR_PER_LEVEL) - 1)] for topic_id, terms in topic_desc: concat_words = ", ".join([word for word, importance in terms]) - names.append(f"{topic_id}: {concat_words}") + names.append( + f"[{color} bold]{topic_id}[/]: [italic]{concat_words}[/]" + ) return names def print_tree(self, top_k: int = 10): @@ -102,6 +119,17 @@ def print_tree(self, top_k: int = 10): console = Console() console.print(tree) + def __str__(self): + tree = Tree("Topic Hierarchy:") + _build_tree(self, tree, top_k=10) + console = Console() + with console.capture() as capture: + console.print(tree) + return capture.get() + + def __repr__(self): + return str(self) + def _topics_table( self, top_k: int = 10, @@ -224,3 +252,4 @@ def add_level(self, n_subtopics: int, **kwargs): self.subtopics = self.model.calculate_subtopics( hierarchy=self, n_subtopics=n_subtopics, **kwargs ) + return self From 2edb49f3f58215e7dbdb92e9d2909b765427660e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 23 Jul 2024 14:58:14 +0200 Subject: [PATCH 05/21] Added path info to hierarchy, made pretty printing less confusing --- turftopic/hierarchical.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py index efb0a7e..ab0fff0 100644 --- a/turftopic/hierarchical.py +++ b/turftopic/hierarchical.py @@ -43,10 +43,20 @@ class TopicHierarchy: components_: np.ndarray document_topic_matrix: np.ndarray subtopics: Optional[list[TopicHierarchy]] = None + path: tuple[int] = () + desc: str = "Root" def __getitem__(self, index: int): return self.subtopics[index] + @property + def level(self) -> int: + return len(self.path) + + @level.setter + def level(self, value): + self._level = value + def get_topics( self, top_k: int = 10 ) -> list[tuple[Any, list[tuple[str, float]]]]: @@ -101,27 +111,15 @@ def _topic_desc(self, top_k: int = 10, level=0) -> str: color = COLOR_PER_LEVEL[min(level, len(COLOR_PER_LEVEL) - 1)] for topic_id, terms in topic_desc: concat_words = ", ".join([word for word, importance in terms]) + topic_id = ".".join(str(elem) for elem in [*self.path, topic_id]) names.append( f"[{color} bold]{topic_id}[/]: [italic]{concat_words}[/]" ) return names - def print_tree(self, top_k: int = 10): - """Prints tree of hierarchical topics. - - Parameters - ---------- - top_k: int, default 10 - Number of top words to describe topics with. - """ - tree = Tree("Topic Hierarchy:") - _build_tree(self, tree, top_k) - console = Console() - console.print(tree) - def __str__(self): - tree = Tree("Topic Hierarchy:") - _build_tree(self, tree, top_k=10) + tree = Tree(f"[bold]{self.desc}[/]") + _build_tree(self, tree, top_k=10, level=self.level) console = Console() with console.capture() as capture: console.print(tree) @@ -252,4 +250,9 @@ def add_level(self, n_subtopics: int, **kwargs): self.subtopics = self.model.calculate_subtopics( hierarchy=self, n_subtopics=n_subtopics, **kwargs ) + for i, (desc, subtopic) in enumerate( + zip(self._topic_desc(level=self.level), self.subtopics) + ): + subtopic.path = (*self.path, i) + subtopic.desc = desc return self From b7704de281a0f74cd5d6f244d3b6e1a94a94a0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 24 Jul 2024 11:11:22 +0200 Subject: [PATCH 06/21] Restructured hierarchy to allow for dividing single topics --- turftopic/hierarchical.py | 316 +++++++++++++++---------------------- turftopic/models/keynmf.py | 66 ++++---- 2 files changed, 153 insertions(+), 229 deletions(-) diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py index ab0fff0..91eec81 100644 --- a/turftopic/hierarchical.py +++ b/turftopic/hierarchical.py @@ -5,23 +5,9 @@ import numpy as np from rich.console import Console -from rich.table import Table from rich.tree import Tree from turftopic.base import ContextualModel -from turftopic.utils import export_table - - -def _build_tree(h: TopicHierarchy, tree: Tree, top_k: int, level=0): - names = h._topic_desc(top_k, level=level) - if h.subtopics is None: - for name in names: - tree.add(name) - return - for name, sub in zip(names, h.subtopics): - branch = tree.add(name) - _build_tree(sub, branch, top_k, level=level + 1) - COLOR_PER_LEVEL = [ "bright_blue", @@ -38,88 +24,119 @@ def _build_tree(h: TopicHierarchy, tree: Tree, top_k: int, level=0): @dataclass -class TopicHierarchy: +class TopicNode: + """Node for a topic in a topic hierarchy. + + Parameters + ---------- model: ContextualModel - components_: np.ndarray - document_topic_matrix: np.ndarray - subtopics: Optional[list[TopicHierarchy]] = None - path: tuple[int] = () - desc: str = "Root" + Underlying topic model, which the hierarchy is based on. + path: tuple[int], default () + Path that leads to this node from the root of the tree. + word_importance: ndarray of shape (n_vocab), default None + Importance of each word in the vocabulary for given topic. + document_topic_vector: ndarray of shape (n_documents), default None + Importance of the topic in all documents in the corpus. + children: list[TopicNode], default None + List of subtopics within this topic. + """ - def __getitem__(self, index: int): - return self.subtopics[index] + model: ContextualModel + path: tuple[int] = () + word_importance: Optional[np.ndarray] = None + document_topic_vector: Optional[np.ndarray] = None + children: Optional[list[TopicNode]] = None + + @classmethod + def create_root( + cls, + model: ContextualModel, + components: np.ndarray, + document_topic_matrix: np.ndarray, + ) -> TopicNode: + """Creates root node from a topic models' components and topic importances in documents.""" + children = [] + n_components = components.shape[0] + for i, comp, doc_top in zip( + range(n_components), components, document_topic_matrix.T + ): + children.append( + cls( + model, + path=(i,), + word_importance=comp, + document_topic_vector=doc_top, + children=None, + ) + ) + return TopicNode( + model, + path=(), + word_importance=None, + document_topic_vector=None, + children=children, + ) @property def level(self) -> int: + """Indicates how deep down the hierarchy the topic is.""" return len(self.path) - @level.setter - def level(self, value): - self._level = value - - def get_topics( - self, top_k: int = 10 - ) -> list[tuple[Any, list[tuple[str, float]]]]: - """Returns high-level topic representations in form of the top K words - in each topic. + def get_words(self, top_k: int = 10) -> list[tuple[str, float]]: + """Returns top words and words importances for the topic. Parameters ---------- top_k: int, default 10 - Number of top words to return for each topic. + Number of top words to return. Returns ------- - list[tuple] - List of topics. Each topic is a tuple of - topic ID and the top k words. - Top k words are a list of (word, word_importance) pairs. + list[tuple[str, float]] + List of word, importance pairs. """ - n_topics = self.components_.shape[0] - try: - classes = self.model.classes_ - except AttributeError: - classes = list(range(n_topics)) - highest = np.argpartition(-self.components_, top_k)[:, :top_k] - vocab = self.model.get_vocab() - top = [] - score = [] - for component, high in zip(self.components_, highest): - importance = component[high] - high = high[np.argsort(-importance)] - score.append(component[high]) - top.append(vocab[high]) - topics = [] - for topic, words, scores in zip(classes, top, score): - topic_data = (topic, list(zip(words, scores))) - topics.append(topic_data) - return topics + if (self.word_importance is None) or ( + self.document_topic_vector + ) is None: + return [] + idx = np.argpartition(-self.word_importance, top_k)[:top_k] + order = np.argsort(self.word_importance[idx]) + idx = idx[order] + imp = self.word_importance[idx] + words = self.model.get_vocab()[idx] + return list(zip(words, imp)) @property - def topic_names(self) -> list[str]: - """Names of the topics based on the highest scoring 4 terms.""" - topic_desc = self.get_topics(top_k=4) - names = [] - for topic_id, terms in topic_desc: - concat_words = "_".join([word for word, importance in terms]) - names.append(f"{topic_id}_{concat_words}") - return names + def description(self) -> str: + """Returns a high level description of the topic with its path in the tree + and top words.""" + if not len(self.path): + path = "Root" + else: + path = ".".join([str(idx) for idx in self.path]) + words = [] + for word, imp in self.get_words(top_k=10): + words.append(word) + concat_words = ", ".join(words) + color = COLOR_PER_LEVEL[min(self.level, len(COLOR_PER_LEVEL) - 1)] + stylized = f"[{color} bold]{path}[/]: [italic]{concat_words}[/]" + console = Console() + with console.capture() as capture: + console.print(stylized) + return capture.get() - def _topic_desc(self, top_k: int = 10, level=0) -> str: - topic_desc = self.get_topics(top_k=top_k) - names = [] - color = COLOR_PER_LEVEL[min(level, len(COLOR_PER_LEVEL) - 1)] - for topic_id, terms in topic_desc: - concat_words = ", ".join([word for word, importance in terms]) - topic_id = ".".join(str(elem) for elem in [*self.path, topic_id]) - names.append( - f"[{color} bold]{topic_id}[/]: [italic]{concat_words}[/]" - ) - return names + def _build_tree(self, tree: Tree = None, top_k: int = 10) -> Tree: + if tree is None: + tree = Tree(self.description) + else: + tree = tree.add(self.description) + if self.children is not None: + for child in self.children: + child._build_tree(tree) + return tree def __str__(self): - tree = Tree(f"[bold]{self.desc}[/]") - _build_tree(self, tree, top_k=10, level=self.level) + tree = self._build_tree(top_k=10) console = Console() with console.capture() as capture: console.print(tree) @@ -128,131 +145,48 @@ def __str__(self): def __repr__(self): return str(self) - def _topics_table( - self, - top_k: int = 10, - show_scores: bool = False, - show_negative: bool = False, - ) -> list[list[str]]: - columns = ["Topic ID", "Highest Ranking"] - if show_negative: - columns.append("Lowest Ranking") - rows = [] - try: - classes = self.model.classes_ - except AttributeError: - classes = list(range(self.components_.shape[0])) - vocab = self.model.get_vocab() - for topic_id, component in zip(classes, self.components_): - highest = np.argpartition(-component, top_k)[:top_k] - highest = highest[np.argsort(-component[highest])] - lowest = np.argpartition(component, top_k)[:top_k] - lowest = lowest[np.argsort(component[lowest])] - if show_scores: - concat_positive = ", ".join( - [ - f"{word}({importance:.2f})" - for word, importance in zip( - vocab[highest], component[highest] - ) - ] - ) - concat_negative = ", ".join( - [ - f"{word}({importance:.2f})" - for word, importance in zip( - vocab[lowest], component[lowest] - ) - ] - ) - else: - concat_positive = ", ".join([word for word in vocab[highest]]) - concat_negative = ", ".join([word for word in vocab[lowest]]) - row = [f"{topic_id}", f"{concat_positive}"] - if show_negative: - row.append(concat_negative) - rows.append(row) - return [columns, *rows] - - def print_topics( - self, - top_k: int = 10, - show_scores: bool = False, - show_negative: bool = False, - ): - """Pretty prints topics at the current level of the hierarchy. + def clear(self): + """Deletes children of the given node.""" + self.children = None + return self - Parameters - ---------- - top_k: int, default 10 - Number of top words to return for each topic. - show_scores: bool, default False - Indicates whether to show importance scores for each word. - show_negative: bool, default False - Indicates whether the most negative terms should also be displayed. - """ - columns, *rows = self._topics_table(top_k, show_scores, show_negative) - table = Table(show_lines=True) - table.add_column("Topic ID", style="blue", justify="right") - table.add_column( - "Highest Ranking", - justify="left", - style="magenta", - max_width=100, - ) - if show_negative: - table.add_column( - "Lowest Ranking", - justify="left", - style="red", - max_width=100, - ) - for row in rows: - table.add_row(*row) - console = Console() - console.print(table) + def __getitem__(self, index: int): + if self.children is None: + raise IndexError("Current node is a leaf and has not children.") + return self.children[index] - def export_topics( - self, - top_k: int = 10, - show_scores: bool = False, - show_negative: bool = False, - format: str = "csv", - ) -> str: - """Exports top K words from topics in a table in a given format. - Returns table as a pure string. + def divide(self, n_subtopics: int, **kwargs): + """Divides current node into smaller subtopics. + Only works when the underlying model is a divisive hierarchical model. Parameters ---------- - top_k: int, default 10 - Number of top words to return for each topic. - show_scores: bool, default False - Indicates whether to show importance scores for each word. - show_negative: bool, default False - Indicates whether the most negative terms should also be displayed. - format: 'csv', 'latex' or 'markdown' - Specifies which format should be used. - 'csv', 'latex' and 'markdown' are supported. + n_subtopics: int + Number of topics to divide the topic into. """ - table = self._topics_table( - top_k, show_scores, show_negative=show_negative - ) - return export_table(table, format=format) + try: + self.children = self.model.divide_topic( + node=self, n_subtopics=n_subtopics, **kwargs + ) + except AttributeError as e: + raise AttributeError( + "Looks like your model is not a divisive hierarchical model." + ) from e + return self - def add_level(self, n_subtopics: int, **kwargs): - """Adds level to hierarchy based on the topics on this level. + def divide_children(self, n_subtopics: int, **kwargs): + """Divides all children of the current node to smaller topics. + Only works when the underlying model is a divisive hierarchical model. Parameters ---------- n_subtopics: int - Number of subtopics to add for each topic on this level. + Number of topics to divide the topics into. """ - self.subtopics = self.model.calculate_subtopics( - hierarchy=self, n_subtopics=n_subtopics, **kwargs - ) - for i, (desc, subtopic) in enumerate( - zip(self._topic_desc(level=self.level), self.subtopics) - ): - subtopic.path = (*self.path, i) - subtopic.desc = desc + if self.children is None: + raise ValueError( + "Current Node is a leaf, children can't be subdivided." + ) + for child in self.children: + child.divide(n_subtopics, **kwargs) return self diff --git a/turftopic/models/keynmf.py b/turftopic/models/keynmf.py index 3f2d396..f7baaaa 100644 --- a/turftopic/models/keynmf.py +++ b/turftopic/models/keynmf.py @@ -11,7 +11,7 @@ from turftopic.base import ContextualModel, Encoder from turftopic.data import TopicData from turftopic.dynamic import DynamicTopicModel -from turftopic.hierarchical import TopicHierarchy +from turftopic.hierarchical import TopicNode from turftopic.models._keynmf import KeywordExtractor, KeywordNMF from turftopic.models.wnmf import weighted_nmf from turftopic.vectorizer import default_vectorizer @@ -109,43 +109,36 @@ def vectorize( ) return self.model.vectorize(keywords) - def calculate_subtopics( + def divide_topic( self, - hierarchy: TopicHierarchy, + node: TopicNode, n_subtopics: int, - keywords: Optional[list[dict[str, float]]] = None, - document_term_matrix: Optional[np.ndarray] = None, - ) -> list[TopicHierarchy]: - document_term_matrix = getattr( - self, "document_term_matrix", document_term_matrix - ) - if (document_term_matrix is None) and (keywords is not None): - document_term_matrix = self.vectorize(keywords) + ) -> list[TopicNode]: + document_term_matrix = getattr(self, "document_term_matrix", None) if document_term_matrix is None: raise ValueError( "document_term_matrix is needed for computing hierarchies. Perhaps you fitted the model online?" ) dtm = document_term_matrix - N = dtm.shape[0] subtopics = [] - for topic_importance, base_component in zip( - hierarchy.document_topic_matrix.T, hierarchy.components_ + weight = node.document_topic_vector + subcomponents, sub_doc_topic = weighted_nmf( + dtm, weight, n_subtopics, self.random_state, max_iter=200 + ) + subcomponents = subcomponents * np.log( + 1 + subcomponents.mean() / (subcomponents.sum(axis=0) + 1) + ) + for i, component, doc_topic_vector in zip( + range(n_subtopics), subcomponents, sub_doc_topic.T ): - weight = topic_importance - subcomponents, sub_doc_topic = weighted_nmf( - dtm, weight, n_subtopics, self.random_state, max_iter=200 - ) - subcomponents = subcomponents * np.log( - 1 + subcomponents.mean() / (subcomponents.sum(axis=0) + 1) - ) - subtopics.append( - TopicHierarchy( - self, - components_=subcomponents, - document_topic_matrix=sub_doc_topic, - subtopics=None, - ) + sub = TopicNode( + self, + path=(*node.path, i), + word_importance=component, + document_topic_vector=doc_topic_vector, + children=None, ) + subtopics.append(sub) return subtopics def fit_transform( @@ -188,11 +181,8 @@ def fit_transform( console.log("Model fitting done.") self.document_topic_matrix = doc_topic_matrix self.document_term_matrix = self.model.vectorize(keywords) - self.hierarchy = TopicHierarchy( - self, - components_=self.components_, - document_topic_matrix=self.document_topic_matrix, - subtopics=None, + self.hierarchy = TopicNode.create_root( + self, self.components_, self.document_topic_matrix ) return doc_topic_matrix @@ -313,11 +303,8 @@ def prepare_topic_data( document_term_matrix = self.model.vectorize(keywords) self.document_topic_matrix = doc_topic_matrix self.document_term_matrix = self.document_term_matrix - self.hierarchy = TopicHierarchy( - self, - components_=self.components_, - document_topic_matrix=self.document_topic_matrix, - subtopics=None, + self.hierarchy = TopicNode.create_root( + self, self.components_, self.document_topic_matrix ) res: TopicData = { "corpus": corpus, @@ -365,6 +352,9 @@ def fit_transform_dynamic( self.components_ = self.model.components self.document_topic_matrix = doc_topic_matrix self.document_term_matrix = self.model.vectorize(keywords) + self.hierarchy = TopicNode.create_root( + self, self.components_, self.document_topic_matrix + ) return doc_topic_matrix def partial_fit_dynamic( From 744566692d6816f0ec5d538b60457f470ce99239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 24 Jul 2024 13:17:06 +0200 Subject: [PATCH 07/21] Made hierarchy printing compact --- turftopic/hierarchical.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py index 91eec81..084784b 100644 --- a/turftopic/hierarchical.py +++ b/turftopic/hierarchical.py @@ -122,7 +122,7 @@ def description(self) -> str: stylized = f"[{color} bold]{path}[/]: [italic]{concat_words}[/]" console = Console() with console.capture() as capture: - console.print(stylized) + console.print(stylized, end="") return capture.get() def _build_tree(self, tree: Tree = None, top_k: int = 10) -> Tree: From 9d47e0c985d4ea4183f3bdca959275953a6b32e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 24 Jul 2024 15:53:25 +0200 Subject: [PATCH 08/21] Added tree plotting utility to hierarchies --- turftopic/hierarchical.py | 87 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/turftopic/hierarchical.py b/turftopic/hierarchical.py index 084784b..d0a5144 100644 --- a/turftopic/hierarchical.py +++ b/turftopic/hierarchical.py @@ -23,6 +23,75 @@ ] +def _tree_plot(hierarchy: TopicNode): + """Plots hierarchy with Plotly as a Tree""" + try: + import igraph as ig + import plotly.express as px + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "You will need to install plotly and igraph to use hierarchical plotting functionality." + ) from e + + def traverse(h, nodes, edges, parent=None): + nodes.append(h) + if parent is not None: + edges.append([parent._simple_desc, h._simple_desc]) + if h.children is not None: + for child in h.children: + traverse(child, nodes, edges, parent=h) + + def word_table(h): + entries = [] + words = h.get_words(top_k=10) + for word, imp in words: + entries.append(f"{word}: {imp:.2f}") + return "
".join(entries) + + nodes = [] + edges = [] + for child in hierarchy.children: + traverse(child, nodes, edges) + node_names = [node._simple_desc for node in nodes] + node_to_idx = {node_name: idx for idx, node_name in enumerate(node_names)} + edges_idx = [ + [node_to_idx[start], node_to_idx[end]] for start, end in edges + ] + tables = [word_table(node) for node in nodes] + graph = ig.Graph(len(nodes), edges=edges_idx, directed=True) + layout = graph.layout("rt") + layout.rotate(-90) + x, y = np.array(layout.coords).T + xmin, xmax = np.min(x), np.max(x) + xpad = (xmax - xmin) * 0.35 + fig = px.scatter(x=x, y=y, text=node_names, template="plotly_white") + fig = fig.update_traces( + customdata=[[table] for table in tables], + hovertemplate="%{text}

%{customdata[0]}", + ) + fig = fig.update_traces(marker=dict(size=20, color="rgba(0,0,0,0.2)")) + fig = fig.update_layout(margin=dict(l=0, r=0, t=0, b=0)) + fig = fig.update_yaxes(showgrid=False, visible=False, zeroline=False) + fig = fig.update_xaxes( + showgrid=False, + visible=False, + zeroline=False, + range=(xmin - xpad, xmax + xpad), + ) + for start, end in edges_idx: + fig.add_shape( + type="line", + xref="x", + yref="y", + x0=x[start], + y0=y[start], + x1=x[end], + y1=y[end], + opacity=0.2, + ) + return fig + + @dataclass class TopicNode: """Node for a topic in a topic hierarchy. @@ -100,7 +169,7 @@ def get_words(self, top_k: int = 10) -> list[tuple[str, float]]: ) is None: return [] idx = np.argpartition(-self.word_importance, top_k)[:top_k] - order = np.argsort(self.word_importance[idx]) + order = np.argsort(-self.word_importance[idx]) idx = idx[order] imp = self.word_importance[idx] words = self.model.get_vocab()[idx] @@ -125,6 +194,18 @@ def description(self) -> str: console.print(stylized, end="") return capture.get() + @property + def _simple_desc(self) -> str: + if not len(self.path): + path = "Root" + else: + path = ".".join([str(idx) for idx in self.path]) + words = [] + for word, imp in self.get_words(top_k=5): + words.append(word) + concat_words = ", ".join(words) + return f"{path}: {concat_words}" + def _build_tree(self, tree: Tree = None, top_k: int = 10) -> Tree: if tree is None: tree = Tree(self.description) @@ -190,3 +271,7 @@ def divide_children(self, n_subtopics: int, **kwargs): for child in self.children: child.divide(n_subtopics, **kwargs) return self + + def plot_tree(self): + """Plots hierarchy as an interactive tree in Plotly.""" + return _tree_plot(self) From f7c6b4d57fdcd077d85cf2c00c332dfb0f72c575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 24 Jul 2024 15:53:46 +0200 Subject: [PATCH 09/21] Added normalization to subtopic components --- turftopic/models/keynmf.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/turftopic/models/keynmf.py b/turftopic/models/keynmf.py index f7baaaa..daf8376 100644 --- a/turftopic/models/keynmf.py +++ b/turftopic/models/keynmf.py @@ -7,6 +7,7 @@ from sentence_transformers import SentenceTransformer from sklearn.exceptions import NotFittedError from sklearn.feature_extraction.text import CountVectorizer +from sklearn.preprocessing import normalize from turftopic.base import ContextualModel, Encoder from turftopic.data import TopicData @@ -128,6 +129,7 @@ def divide_topic( subcomponents = subcomponents * np.log( 1 + subcomponents.mean() / (subcomponents.sum(axis=0) + 1) ) + subcomponents = normalize(subcomponents, axis=1, norm="l2") for i, component, doc_topic_vector in zip( range(n_subtopics), subcomponents, sub_doc_topic.T ): From 54b458588ec50763ff3e8d59c4c0d857b82fc0ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 24 Jul 2024 16:16:51 +0200 Subject: [PATCH 10/21] Added docs for hierarchical modeling --- docs/KeyNMF.md | 41 +++++++++ docs/dynamic.md | 2 +- docs/hierarchical.md | 152 +++++++++++++++++++++++++++++++++ docs/images/hierarchy_tree.png | Bin 0 -> 252453 bytes 4 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 docs/hierarchical.md create mode 100644 docs/images/hierarchy_tree.png diff --git a/docs/KeyNMF.md b/docs/KeyNMF.md index c785f62..85742b7 100644 --- a/docs/KeyNMF.md +++ b/docs/KeyNMF.md @@ -309,6 +309,47 @@ for batch in batched(zip(corpus, timestamps)): model.partial_fit_dynamic(text_batch, timestamps=ts_batch, bins=bins) ``` +## Hierarchical Topic Modeling + +When you suspect that subtopics might be present in the topics you find with the model, KeyNMF can be used to discover topics further down the hierarchy. + +This is done by utilising a special case of **weighted NMF**, where documents are weighted by how high they score on the parent topic. +In other words: + +1. Decompose keyword matrix $M \approx WH$ +2. To find subtopics in topic $j$, define document weights $w$ as the $j$th column of $W$. +3. Estimate subcomponents with **wNMF** $M \approx \mathring{W} \mathring{H}$ with document weight $w$ + 1. Initialise $\mathring{H}$ and $\mathring{W}$ randomly. + 2. Perform multiplicative updates until convergence.
+ $\mathring{W}^T = \mathring{W}^T \odot \frac{\mathring{H} \cdot (M^T \odot w)}{\mathring{H} \cdot \mathring{H}^T \cdot (\mathring{W}^T \odot w)}$
+ $\mathring{H}^T = \mathring{H}^T \odot \frac{ (M^T \odot w)\cdot \mathring{W}}{\mathring{H}^T \cdot (\mathring{W}^T \odot w) \cdot \mathring{W}}$ +4. To sufficiently differentiate the subcomponents from each other a pseudo-c-tf-idf weighting scheme is applied to $\mathring{H}$: + 1. $\mathring{H} = \mathring{H}_{ij} \odot ln(1 + \frac{A}{1+\sum_k \mathring{H}_{kj}})$, where $A$ is the average of all elements in $\mathring{H}$ + +To create a hierarchical model, you can use the `hierarchy` property of the model. + +```python +# This divides each of the topics in the model to 3 subtopics. +model.hierarchy.divide_children(n_subtopics=3) +print(model.hierarchy) +``` + +
+ +Root
+├── 0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
+│ ├── 0.0: dos, file, disk, files, program, windows, disks, shareware, norton, memory
+│ ├── 0.1: os, unix, windows, microsoft, apps, nt, ibm, ms, os2, platform
+│ └── 0.2: card, drivers, monitor, driver, vga, ram, motherboard, cards, graphics, ati
+└── 1: atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs
+. ├── 1.0: atheism, alt, newsgroup, reading, faq, islam, questions, read, newsgroups, readers
+. ├── 1.1: atheists, atheist, belief, theists, beliefs, religious, religion, agnostic, gods, religions
+. └── 1.2: morality, bible, christian, christians, moral, christianity, biblical, immoral, god, religion
+
+
+ +For a detailed tutorial on hierarchical modeling click [here](hierarchical.md). + ## Considerations ### Strengths diff --git a/docs/dynamic.md b/docs/dynamic.md index 772a60b..6693cf5 100644 --- a/docs/dynamic.md +++ b/docs/dynamic.md @@ -77,7 +77,7 @@ model.plot_topics_over_time(top_k=5)
Topics over time on a Figure
-## Interface +## API reference All dynamic topic models have a `temporal_components_` attribute, which contains the topic-term matrices for each time slice, along with a `temporal_importance_` attribute, which contains the importance of each topic in each time slice. diff --git a/docs/hierarchical.md b/docs/hierarchical.md new file mode 100644 index 0000000..de5696e --- /dev/null +++ b/docs/hierarchical.md @@ -0,0 +1,152 @@ +# Hierarchical Topic Modeling + +> Note: Hierarchical topic modeling in Turftopic is still in its early stages, you can expect more visualization utilities, tools and models in the future :sparkles: + +You might expect some topics in your corpus to belong to a hierarchy of topics. +Some models in Turftopic (currently only [KeyNMF](KeyNMF.md)) allow you to investigate hierarchical relations and build a taxonomy of topics in a corpus. + +## Divisive Hierarchical Modeling + +Currently Turftopic, in contrast with other topic modeling libraries only allows for hierarchical modeling in a divisive context. +This means that topics can be divided into subtopics in a **top-down** manner. +[KeyNMF](KeyNMF.md) does not discover a topic hierarchy automatically, + but you can manually instruct the model to find subtopics in larger topics. + +As a demonstration, let's load a corpus, that we know to have hierarchical themes. + +```python +from sklearn.datasets import fetch_20newsgroups + +corpus = fetch_20newsgroups( + subset="all", + remove=("headers", "footers", "quotes"), + categories=[ + "comp.os.ms-windows.misc", + "comp.sys.ibm.pc.hardware", + "talk.religion.misc", + "alt.atheism", + ], +).data +``` + +In this case, we have two base themes, which are **computers**, and **religion**. +Let us fit a KeyNMF model with two topics to see if the model finds these. + +```python +from turftopic import KeyNMF + +model = KeyNMF(2, top_n=15, random_state=42).fit(corpus) +model.print_topics() +``` + +| Topic ID | Highest Ranking | +| - | - | +| 0 | windows, dos, os, disk, card, drivers, file, pc, files, microsoft | +| 1 | atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs | + +The results conform our intuition. Topic 0 seems to revolve around IT, while Topic 1 around atheism and religion. +We can already suspect, however that more granular topics could be discovered in this corpus. +For instance Topic 0 contains terms related to operating systems, like *windows* and *dos*, but also components, like *disk* and *card*. + +We can access the hierarchy of topics in the model at the current stage, with the model's `hierarchy` property. + +```python +print(model.hierarchy) +``` + +
+ +Root
+├── 0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
+└── 1: atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs
+
+
+ +There isn't much to see yet, the model contains a flat hierarchy of the two topics we discovered and we are at root level. +We can dissect these topics, by adding a level to the hierarchy. + +Let us add 3 subtopics to each topic on the root level. + +```python +model.hierarchy.divide_children(n_subtopics=3) +``` + +
+ +Root
+├── 0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
+│ ├── 0.0: dos, file, disk, files, program, windows, disks, shareware, norton, memory
+│ ├── 0.1: os, unix, windows, microsoft, apps, nt, ibm, ms, os2, platform
+│ └── 0.2: card, drivers, monitor, driver, vga, ram, motherboard, cards, graphics, ati
+└── 1: atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs
+. ├── 1.0: atheism, alt, newsgroup, reading, faq, islam, questions, read, newsgroups, readers
+. ├── 1.1: atheists, atheist, belief, theists, beliefs, religious, religion, agnostic, gods, religions
+. └── 1.2: morality, bible, christian, christians, moral, christianity, biblical, immoral, god, religion
+
+
+ +As you can see, the model managed to identify meaningful subtopics of the two larger topics we found earlier. +Topic 0 got divided into a topic mostly concerned with dos and windows, a topic on operating systems in general, and one about hardware, +while Topic 1 contains a topic about newsgroups, one about atheism, and one about morality and christianity. + +You can also easily access nodes of the hierarchy by indexing it: +```python +model.hierarchy[0] +``` + +
+ +0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
+├── 0.0: dos, file, disk, files, program, windows, disks, shareware, norton, memory
+├── 0.1: os, unix, windows, microsoft, apps, nt, ibm, ms, os2, platform
+└── 0.2: card, drivers, monitor, driver, vga, ram, motherboard, cards, graphics, ati
+
+
+ +You can also divide individual topics to a number of subtopics, by using the `divide()` method. +Let us divide Topic 0.0 to 5 subtopics. + +```python +model.hierarchy[0][0].divide(5) +model.hierarchy +``` + +
+ +Root
+├── 0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
+│ ├── 0.0: dos, file, disk, files, program, windows, disks, shareware, norton, memory
+│ │ ├── 0.0.1: file, files, ftp, bmp, program, windows, shareware, directory, bitmap, zip
+│ │ ├── 0.0.2: os, windows, unix, microsoft, crash, apps, crashes, nt, pc, operating
+│ │ ├── 0.0.3: disk, disks, floppy, drive, drives, scsi, boot, hd, norton, ide
+│ │ ├── 0.0.4: dos, modem, command, ms, emm386, serial, commands, 386, drivers, batch
+│ │ └── 0.0.5: printer, print, printing, fonts, font, postscript, hp, printers, output, driver
+│ ├── 0.1: os, unix, windows, microsoft, apps, nt, ibm, ms, os2, platform
+│ └── 0.2: card, drivers, monitor, driver, vga, ram, motherboard, cards, graphics, ati
+└── 1: atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs
+. ├── 1.0: atheism, alt, newsgroup, reading, faq, islam, questions, read, newsgroups, readers
+. ├── 1.1: atheists, atheist, belief, theists, beliefs, religious, religion, agnostic, gods, religions
+. └── 1.2: morality, bible, christian, christians, moral, christianity, biblical, immoral, god, religion
+
+
+ +## Visualization +You can visualize hierarchies in Turftopic by using the `plot_tree()` method of a topic hierarchy. +The plot is interactive and you can zoom in or hover on individual topics to get an overview of the most important words. + +```python +model.hierarchy.plot_tree() +``` + +
+ +
Tree plot of the hierarchy.
+
+ + +## API reference + +::: turftopic.hierarchical.TopicNode + + + diff --git a/docs/images/hierarchy_tree.png b/docs/images/hierarchy_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..9696d288cd1dcd94b9c556010f36e02ebaddceca GIT binary patch literal 252453 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
V0Wl>rwfNT_rE%D?WZHB~FK z@?EXe%*X1g+Lo>c!0L0EHQcBtUR4_uiHP&^(Ex%L&_K@~>7i_J>xJ^Yf03ly>eVoM z<>r5ous(74nUCyDo*Q6v(f=YTz(9e&{|js@^GF?o{*6ZKk94*MnKprh3GKgbt=dpv&1Ka>|A{>&&+Gvic5Dh`aM1moQb*mQqp+3Ii4cN2E%43I>D zJgt&co6UhfJDVS{7U?jIy-*E<`Y0C56Y(c*0-^8!&bWQf;}@3H&dO$tQ_;d9pqcse zDWiad&KO1haAodeCuy_EiYWO&wyjS9DB0B9SBg4HrKH-$I*F|aVw{ygpcZ^o>*k+_ zBvFKydpIc}!oG*i{MQjnj1lzr=cE+e@|SN2&B{wbgaS&Ruddom>kk$ILuqv!Uab2Z zbyN8;`GdFLI|zUX)$Zoe|I29|B`k?Jgh2sz`6J6N=^ak@c6jzDkI;>mS^WITAbR^a!1KELvkpsAGm5M;MGhpm{7t)dt4KweoiaH3<86w@W&DS=F z4qw1i68|3=hB*-ADEH(V@C()d=r$*8Z5kdv4(8H2I1GxmYyUTs;5KogPU&!72JVI< zo=ngkz4HFeugmerh0#3qCzoK*+?qnW4@e}O|4OXA z^f0)s(y@~O_*TQZ;6vCc8gx(i#$TkUcCjv3$1U(5qMQ@m)GgGQe-d0i-T3U<>(Jr- zh7_&7M0_{ZbZE04tJ9r?4^yEk)c(?aYHV8aM7%X3CGiF3S=|Cp8G*yDchTw_0YaKx zG5whwi&Rdc(){<-bpJ>tz#$6b8A~PEP|ttEP1C0jgVFUgBN-cvHV_al{qon-1*;%) z{8E#QK=D1ot*46O?@tvqYRwYUaFxQZyo2_=!T+3CFcfTUX1>wg|M?&MVpG%s3sU!s zLg-2D${||;6p3CDDG4YP!)s~ec>2JJ4ifQy3TZzMN}>htVR(at-4BhQ{dIL5-Huj{ zaP#x?n+WIU<$WG~MHCkyg!)(iCYAp9<-JbQxFnNIz228p;Z$0KScm9^iaakf#d5+S%|hdEox} zZl-kQ09ExBac)U}t0x6;#9b&np-ZyTUda6yqpQaiUhT2q|9ED_;8*oaFdSbKunO%R zUykVcw5<%L@V%&@pzwRYwvMi#Xl`y+S|EPU_tSOW!M9avcWnH(Qm5e8Pco;~yx(VL zXE*AYSv0hsxKBhxGjrXp?>l~8HvBbHJ2>LW3nci0FLKr_Q7_m3I{$=dQnPQfBi;x62URE{)$#y11Je6o zza6b#$wi$4h;TV`E#I@@uuIe;?G_qau0nuj!VDlRy5Dhe13~*JgdFbbNsCztsC>gx z=0cZ&z|&Y}e|=}|(-{A$FH1i|5i>slZ2=r(6}h`P;>`(Y@3|(-{QB3$jB7fwn+yEC1@}8v)W@{LQ!SM!WhDDMa@vq{t-xtJsHF%#^Qe? zMre_Q`{0vSwU0Ra`YdD)hqSbGES(?fFKGkp7Vr@!B=3g)#YaFxB|uyDYq}+BWqP)L zRxs1DBLHea*isQ`O$jeTvI9?QznH+4q-q#cOc*)GS!lTV+@LSuNrVI`d+bZ}SHmbu zht%@zg<{|8>W^k23-k)y<|BVe8YO`e?jzu9U1n#Og=t&!*EclGLCvhL{^gQ&@smPn z#9XYP|LdY#wTKE<+Qw=EQb9SSs#Ox~$oZR(9{6F{vNv2n=Dy<3LE7D=_4qwtTFyO_ z_H|{@Tj2Oj#2|8JKW}?!`P@5(GNGmbGBc^R*6F`B&^tv>F#UQ3W+7@YSem;!DW|@+ z1N!|JT2jS^+rN&p3>@dgLd35zqldvF^NS~Xj@#=!`l%%)C8}E!lats4$!C`!5abXB z2{M3G9DeJ#Pvw^BMfYA3tOY9SqhBxJQK98j5;LBjuXU;#j`@P@Y0 zPx)%Df5V*VID&o~_fJoW##XnWT@1tD>MC?6-
    ` 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

    p-1ctkV84*SMbpiZ_#&Vgs()>`Y)l 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]*h4a%9bNJ#Run5-i9-ML( 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

    k2w^o*el^G{c;g}-3UgH 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 literal 0 HcmV?d00001 From 996070ce06cf6f3e0caae07d0ea4f805b694572c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 12:45:51 +0200 Subject: [PATCH 11/21] Added Hierarchical page to mkdocs.yml --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 3a4e8f9..e6dd63a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,6 +7,7 @@ nav: - Using Turftopic: basics.md - Dynamic Topic Modeling: dynamic.md - Online Topic Modeling: online.md + - Hierarchical Topic Modeling: hierarchical.md - Model Persistence: persistence.md - Models: - Model Overview: model_overview.md From 6c678bd3b2f2e8dd500d6e4f714bd6a3965028b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 13:39:49 +0200 Subject: [PATCH 12/21] Made KeyNMF online fitting more error tolerant and safer --- turftopic/models/_keynmf.py | 31 +++++++++++++++++-------------- turftopic/models/keynmf.py | 14 ++++++++++++++ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/turftopic/models/_keynmf.py b/turftopic/models/_keynmf.py index d3ca8b7..e48e585 100644 --- a/turftopic/models/_keynmf.py +++ b/turftopic/models/_keynmf.py @@ -1,16 +1,13 @@ import itertools +import warnings from datetime import datetime from typing import Iterable, Optional import numpy as np import scipy.sparse as spr from sklearn.base import clone -from sklearn.decomposition._nmf import ( - NMF, - MiniBatchNMF, - _initialize_nmf, - _update_coordinate_descent, -) +from sklearn.decomposition._nmf import (NMF, MiniBatchNMF, _initialize_nmf, + _update_coordinate_descent) from sklearn.exceptions import NotFittedError from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity @@ -123,7 +120,7 @@ def batch_extract_keywords( if not np.any(mask): keywords.append(dict()) continue - important_terms = np.squeeze(np.asarray(mask)) + important_terms = np.ravel(np.asarray(mask)) word_embeddings = [ self.term_embeddings[self.key_to_index[term]] for term in batch_vocab[important_terms] @@ -241,13 +238,19 @@ def transform(self, keywords: list[dict[str, float]]): def partial_fit(self, keyword_batch: list[dict[str, float]]): X = self.vectorize(keyword_batch, fitting=True) - check_non_negative(X, "NMF (input X)") - self._add_word_components(X) - W, _ = _initialize_nmf(X, self.n_components, random_state=self.seed) - _minibatchnmf = MiniBatchNMF( - self.n_components, init="custom", random_state=self.seed - ).partial_fit(X, W=W, H=self.components) - self.components = _minibatchnmf.components_.astype(X.dtype) + try: + check_non_negative(X, "NMF (input X)") + self._add_word_components(X) + W, _ = _initialize_nmf( + X, self.n_components, random_state=self.seed + ) + _minibatchnmf = MiniBatchNMF( + self.n_components, init="custom", random_state=self.seed + ).partial_fit(X, W=W, H=self.components) + self.components = _minibatchnmf.components_.astype(X.dtype) + except ValueError as e: + warnings.warn(f"Batch failed with error: {e}, skipping.") + return self return self def fit_transform_dynamic( diff --git a/turftopic/models/keynmf.py b/turftopic/models/keynmf.py index daf8376..63caa46 100644 --- a/turftopic/models/keynmf.py +++ b/turftopic/models/keynmf.py @@ -1,3 +1,4 @@ +import warnings from datetime import datetime from typing import Optional, Union @@ -62,6 +63,7 @@ def __init__( self.n_components = n_components self.top_n = top_n self.encoder = encoder + self._has_custom_vectorizer = vectorizer is not None if isinstance(encoder, str): self.encoder_ = SentenceTransformer(encoder) else: @@ -261,6 +263,18 @@ def partial_fit( keywords: list[dict[str, float]], optional Precomputed keyword dictionaries. """ + if not self._has_custom_vectorizer: + self.vectorizer = CountVectorizer(stop_words="english") + self._has_custom_vectorizer = True + min_df = self.vectorizer.min_df + max_df = self.vectorizer.max_df + if (min_df != 1) or (max_df != 1.0): + warnings.warn(f"""When applying partial fitting, the vectorizer is fitted batch-wise in KeyNMF. + You have a vectorizer with min_df={min_df}, and max_df={max_df}. + If you continue with these settings, all tokens might get filtered out. + We recommend setting min_df=1 and max_df=1.0 for online fitting. + `model = KeyNMF(10, vectorizer=CountVectorizer(min_df=1, max_df=1.0)` + """) if keywords is None and raw_documents is None: raise ValueError( "You have to pass either keywords or raw_documents." From 1d615acde1ee7f49f8669c67a0c110762150b08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 13:54:07 +0200 Subject: [PATCH 13/21] joined prepare_topic_data and _export_table tests --- tests/test_integration.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 33e3361..e9c8082 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -11,8 +11,14 @@ from sklearn.datasets import fetch_20newsgroups from sklearn.decomposition import PCA -from turftopic import (GMM, AutoEncodingTopicModel, ClusteringTopicModel, - FASTopic, KeyNMF, SemanticSignalSeparation) +from turftopic import ( + GMM, + AutoEncodingTopicModel, + ClusteringTopicModel, + FASTopic, + KeyNMF, + SemanticSignalSeparation, +) def batched(iterable, n: int): @@ -95,17 +101,6 @@ def generate_dates( online_models = [KeyNMF(3, encoder=trf)] -@pytest.mark.parametrize("model", models) -def test_fit_export_table(model): - doc_topic_matrix = model.fit_transform(texts, embeddings=embeddings) - table = model.export_topics(format="csv") - with tempfile.TemporaryDirectory() as tmpdirname: - out_path = Path(tmpdirname).joinpath("topics.csv") - with out_path.open("w") as out_file: - out_file.write(table) - df = pd.read_csv(out_path) - - @pytest.mark.parametrize("model", dynamic_models) def test_fit_dynamic(model): doc_topic_matrix = model.fit_transform_dynamic( @@ -138,7 +133,7 @@ def test_fit_online(model): @pytest.mark.parametrize("model", models) -def test_prepare_topic_data(model): +def test_prepare_topic_data_export_table(model): topic_data = model.prepare_topic_data(texts, embeddings=embeddings) for key, value in topic_data.items(): # We allow transform() to be None for transductive models @@ -146,3 +141,9 @@ def test_prepare_topic_data(model): continue if value is None: raise TypeError(f"Field {key} is None in topic_data.") + table = model.export_topics(format="csv") + with tempfile.TemporaryDirectory() as tmpdirname: + out_path = Path(tmpdirname).joinpath("topics.csv") + with out_path.open("w") as out_file: + out_file.write(table) + df = pd.read_csv(out_path) From 87262d7f348c637a7fa8c44f310183ac729e0810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:05:43 +0200 Subject: [PATCH 14/21] Fixed prepare_topic_data for KeyNMF --- turftopic/models/keynmf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turftopic/models/keynmf.py b/turftopic/models/keynmf.py index 63caa46..b083cdb 100644 --- a/turftopic/models/keynmf.py +++ b/turftopic/models/keynmf.py @@ -318,7 +318,7 @@ def prepare_topic_data( console.log("Model fitting done.") document_term_matrix = self.model.vectorize(keywords) self.document_topic_matrix = doc_topic_matrix - self.document_term_matrix = self.document_term_matrix + self.document_term_matrix = document_term_matrix self.hierarchy = TopicNode.create_root( self, self.components_, self.document_topic_matrix ) From 24c204617048772325200743353d14dffe65b6a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:07:56 +0200 Subject: [PATCH 15/21] FASTopic is no longer an optional import --- turftopic/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/turftopic/__init__.py b/turftopic/__init__.py index 541a9cb..ecfed28 100644 --- a/turftopic/__init__.py +++ b/turftopic/__init__.py @@ -2,6 +2,7 @@ from turftopic.error import NotInstalled from turftopic.models.cluster import ClusteringTopicModel from turftopic.models.decomp import SemanticSignalSeparation +from turftopic.models.fastopic import FASTopic from turftopic.models.gmm import GMM from turftopic.models.keynmf import KeyNMF @@ -10,10 +11,6 @@ except ModuleNotFoundError: AutoEncodingTopicModel = NotInstalled("AutoEncodingTopicModel", "pyro-ppl") -try: - from turftopic.models.fastopic import FASTopic -except ModuleNotFoundError: - FASTopic = NotInstalled("FASTopic", "torch") __all__ = [ "ClusteringTopicModel", From 3efb55973975181dbafe7748a9a985f86566c618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:08:21 +0200 Subject: [PATCH 16/21] Added docs page for FASTopic --- docs/FASTopic.md | 15 +++++++++++++++ mkdocs.yml | 1 + 2 files changed, 16 insertions(+) create mode 100644 docs/FASTopic.md diff --git a/docs/FASTopic.md b/docs/FASTopic.md new file mode 100644 index 0000000..9338469 --- /dev/null +++ b/docs/FASTopic.md @@ -0,0 +1,15 @@ +# FASTopic + +FASTopic is a neural topic model based on Dual Semantic-relation Reconstruction. + +> Turftopic contains an implementation repurposed for our API, but the implementation is mostly from the [original FASTopic package](https://github.com/BobXWu/FASTopic). + +:warning: This part of the documentation is still under construction :warning: + +## References + +Wu, X., Nguyen, T., Zhang, D. C., Wang, W. Y., & Luu, A. T. (2024). FASTopic: A Fast, Adaptive, Stable, and Transferable Topic Modeling Paradigm. ArXiv Preprint ArXiv:2405.17978. + +## API Reference + +::: turftopic.models.fastopic.FASTopic diff --git a/mkdocs.yml b/mkdocs.yml index e6dd63a..ce5048b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,6 +16,7 @@ nav: - GMM: GMM.md - Clustering Models: clustering.md - Autoencoding Models: ctm.md + - FASTopic: fastopic.md - Encoders: encoders.md theme: name: material From 74d313944264b551d2493ee5d508896fea4e5441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:08:40 +0200 Subject: [PATCH 17/21] Version bump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5587b32..384d349 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ line-length=79 [tool.poetry] name = "turftopic" -version = "0.4.5" +version = "0.5.0" description = "Topic modeling with contextual representations from sentence transformers." authors = ["Márton Kardos "] license = "MIT" From e2486ab4e3720d3ded5b34cc63daae10b4674c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:15:38 +0200 Subject: [PATCH 18/21] Updated readme --- README.md | 56 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index c9a309e..252342e 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,10 @@ - Semantic Signal Separation - S³ 🧭 - KeyNMF 🔑 (paper in progress ⏳) - GMM :gem: (paper soon) - - Implementations of existing transformer-based topic models + - Implementations of other transformer-based topic models - Clustering Topic Models: BERTopic and Top2Vec - Autoencoding Topic Models: CombinedTM and ZeroShotTM + - FASTopic :zap: - Streamlined scikit-learn compatible API 🛠️ - Easy topic interpretation 🔍 - Dynamic Topic Modeling 📈 (GMM, ClusteringTopicModel and KeyNMF) @@ -19,43 +20,45 @@ > This package is still work in progress and scientific papers on some of the novel methods are currently undergoing peer-review. If you use this package and you encounter any problem, let us know by opening relevant issues. -### New in version 0.4.0 +### New in version 0.5.0 -#### Online KeyNMF +#### Hierarchical KeyNMF -You can now online fit and finetune KeyNMF as you wish! +You can now subdivide topics in KeyNMF at will. ```python -from itertools import batched from turftopic import KeyNMF -model = KeyNMF(10, top_n=5) - -corpus = ["some string", "etc", ...] -for batch in batched(corpus, 200): - batch = list(batch) - model.partial_fit(batch) +model = KeyNMF(2, top_n=15, random_state=42).fit(corpus) +model.hierarchy.divide_children(n_subtopics=3) +print(model.hierarchy) ``` -#### $S^3$ Concept Compasses +
    + +Root
    +├── 0: windows, dos, os, disk, card, drivers, file, pc, files, microsoft
    +│ ├── 0.0: dos, file, disk, files, program, windows, disks, shareware, norton, memory
    +│ ├── 0.1: os, unix, windows, microsoft, apps, nt, ibm, ms, os2, platform
    +│ └── 0.2: card, drivers, monitor, driver, vga, ram, motherboard, cards, graphics, ati
    +└── 1: atheism, atheist, atheists, religion, christians, religious, belief, christian, god, beliefs
    +. ├── 1.0: atheism, alt, newsgroup, reading, faq, islam, questions, read, newsgroups, readers
    +. ├── 1.1: atheists, atheist, belief, theists, beliefs, religious, religion, agnostic, gods, religions
    +. └── 1.2: morality, bible, christian, christians, moral, christianity, biblical, immoral, god, religion
    +
    +
    -You can now produce a compass of concepts along two semantic axes using $S^3$. - - - - - -
    - -```python -model = SemanticSignalSeparation(10).fit(corpus) -fig = model.concept_compass(topic_x=1, topic_y=4) -fig.show() -``` +#### FASTopic *(Experimental)* -
    +You can now use [FASTopic](https://github.com/BobXWu/FASTopic) inside Turftopic. +```python +from turftopic import FASTopic + +model = FASTopic(10).fit(corpus) +model.print_topics() +``` ## Basics [(Documentation)](https://x-tabdeveloping.github.io/turftopic/) [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/x-tabdeveloping/turftopic/blob/main/examples/basic_example_20newsgroups.ipynb) @@ -180,6 +183,7 @@ Alternatively you can use the [Figures API](https://x-tabdeveloping.github.io/to ## References - Kardos, M., Kostkan, J., Vermillet, A., Nielbo, K., Enevoldsen, K., & Rocca, R. (2024, June 13). $S^3$ - Semantic Signal separation. arXiv.org. https://arxiv.org/abs/2406.09556 +- Wu, X., Nguyen, T., Zhang, D. C., Wang, W. Y., & Luu, A. T. (2024). FASTopic: A Fast, Adaptive, Stable, and Transferable Topic Modeling Paradigm. ArXiv Preprint ArXiv:2405.17978. - Grootendorst, M. (2022, March 11). BERTopic: Neural topic modeling with a class-based TF-IDF procedure. arXiv.org. https://arxiv.org/abs/2203.05794 - Angelov, D. (2020, August 19). Top2VEC: Distributed representations of topics. arXiv.org. https://arxiv.org/abs/2008.09470 - Bianchi, F., Terragni, S., & Hovy, D. (2020, April 8). Pre-training is a Hot Topic: Contextualized Document Embeddings Improve Topic Coherence. arXiv.org. https://arxiv.org/abs/2004.03974 From 29649e361ac0173f9bc82abfe066193df54be5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Tue, 30 Jul 2024 14:16:35 +0200 Subject: [PATCH 19/21] Added FASTopic to documentation index page --- docs/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 0aca15a..3c9b874 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,7 +23,7 @@ pip install turftopic[pyro-ppl] You can use most transformer-based topic models in Turftopic, these include: - [Semantic Signal Separation - $S^3$](s3.md) :compass: -- [KeyNMF](KeyNMF.md) :key: + - [KeyNMF](KeyNMF.md) :key: - [Gaussian Mixture Models (GMM)](gmm.md) - [Clustering Topic Models](clustering.md): - [BERTopic](clustering.md#bertopic_and_top2vec) @@ -31,6 +31,8 @@ You can use most transformer-based topic models in Turftopic, these include: - [Auto-encoding Topic Models](ctm.md): - CombinedTM - ZeroShotTM + - [FASTopic](fastopic.md) :zap: + ## Basic Usage From 1cda1df74af977d23534bc002ac3b0a72e35b0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 31 Jul 2024 09:51:03 +0200 Subject: [PATCH 20/21] Added test for hierarchical --- tests/test_integration.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_integration.py b/tests/test_integration.py index e9c8082..e73c7fd 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -147,3 +147,10 @@ def test_prepare_topic_data_export_table(model): with out_path.open("w") as out_file: out_file.write(table) df = pd.read_csv(out_path) + + +def test_hierarchical(): + model = KeyNMF(2).fit(texts, embeddings=embeddings) + model.hierarchy.divide_children(3) + model.hierarchy[0][0].divide(3) + repr = str(model.hierarchy) From 9a48eaa756ee7ce9f38907c5fe504f4dce45c2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rton=20Kardos?= Date: Wed, 31 Jul 2024 09:56:29 +0200 Subject: [PATCH 21/21] Update README.md Co-authored-by: Kenneth Enevoldsen --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 252342e..e112b32 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - Implementations of other transformer-based topic models - Clustering Topic Models: BERTopic and Top2Vec - Autoencoding Topic Models: CombinedTM and ZeroShotTM - - FASTopic :zap: + - FASTopic - Streamlined scikit-learn compatible API 🛠️ - Easy topic interpretation 🔍 - Dynamic Topic Modeling 📈 (GMM, ClusteringTopicModel and KeyNMF)