Minibatchkmeans Bertopic gibt keine Themen für die Hälfte der Daten zurückPython

Python-Programme
Anonymous
 Minibatchkmeans Bertopic gibt keine Themen für die Hälfte der Daten zurück

Post by Anonymous »

Ich versuche, einen Datensatz mit Tweets zu thematisieren. Ich habe rund 50 Millionen Tweets. Leider passt ein so großer Datensatz aufgrund der Einbettungen nicht in RAM (sogar 128 GB). Daher habe ich daran gearbeitet, eine inkrementelle Bertopic gemäß den Dokumenten zu erstellen.from bertopic.vectorizers import OnlineCountVectorizer
from bertopic.vectorizers import ClassTfidfTransformer
from sklearn.cluster import MiniBatchKMeans
import numpy as np

class SafeIncrementalPCA(IncrementalPCA):
def partial_fit(self, X, y=None):
# Ensure the input is contiguous and in float64
X = np.ascontiguousarray(X, dtype=np.float64)
return super().partial_fit(X, y)

def transform(self, X):
result = super().transform(X)
# Force the output to be float64 and contiguous
return np.ascontiguousarray(result, dtype=np.float64)

vectorizer_model = OnlineCountVectorizer(stop_words="english")
ctfidf_model = ClassTfidfTransformer(reduce_frequent_words=True, bm25_weighting=True)
umap_model = SafeIncrementalPCA(n_components=100)
cluster_model = MiniBatchKMeans(n_clusters=1000, random_state=0)

from bertopic import BERTopic

topic_model = BERTopic(umap_model=umap_model,
hdbscan_model=cluster_model,

for docs_delayed, emb_delayed in tqdm(zip(docs_partitions, embeddings_partitions), total=len(docs_partitions)):

docs_pdf = docs_delayed.compute()
emb_pdf = emb_delayed.compute()

docs = docs_pdf["text"].tolist()
embeddings = np.vstack(emb_pdf['embeddings'].tolist())

# Partial fit your model (make sure your model supports partial_fit, like many scikit-learn estimators do)
topic_model.partial_fit(docs, embeddings)

< /code>
und dann den Datensatz in eine SQL-Datenbank umwandeln: < /p>

for docs_delayed, emb_delayed in tqdm(zip(docs_partitions, embeddings_partitions), total=len(docs_partitions)):

docs_pdf = docs_delayed.compute()
emb_pdf = emb_delayed.compute()
docs = docs_pdf["text"].tolist()
embeddings = np.vstack(emb_pdf['embeddings'].tolist())

# 3) Apply BERTopic on this shard
topics, probs = topic_model.transform(docs, embeddings)

# Save topics to DataFrame
df_topics = pd.DataFrame({
"tweet_id": docs_pdf["id"].tolist(),
"topic": topics,
"probability": probs
})

## Merge & store in DB
docs_pdf["topic"] = df_topics["topic"]
docs_pdf["probability"] = df_topics["probability"]
docs_pdf.to_sql("tweets", engine, if_exists="append", index=False)
< /code>
Ich habe schon eine ganze Weile versucht, dies zu tun, und dies ist das nächstgelegene Beispiel, das ich bekommen habe. Das einzige Problem ist, dass die Hälfte des Datensatzes am Ende Null -Themen in der Datenbank hat. Soweit ich die Theorie verstehe, sollten Minibatchkmeans keine Ausreißer haben, und daher sollten alle Tweets mindestens einem Thema zugeordnet werden, oder? Ich habe die nicht klassifizierten Tweets überprüft und es gibt nichts in ihrem Dokument, das darauf hindeutet, dass es schwierig wäre, zu klassifizieren (im Vergleich zu anderen, die klassifiziert werden).>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post