質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

192閲覧

bertopic結果のランダム性

otetsu04310431

総合スコア9

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

1グッド

0クリップ

投稿2024/11/25 05:19

編集2024/11/25 05:37
import pandas as pd from bertopic import BERTopic from sklearn.feature_extraction.text import CountVectorizer from sklearn.cluster import KMeans import MeCab import numpy as np import random import re from umap import UMAP # ランダムシードの設定 SEED = 42 np.random.seed(SEED) random.seed(SEED) # CSVファイルの読み込み df = pd.read_csv("total_1980-1989.csv") # lyrics列を取得 texts = df['lyrics'].astype(str).tolist() # Stopwordsの取得 !curl -O https://web.archive.org/web/20230315222712/http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt with open("Japanese.txt", "r") as f: stopwords = f.read().split("\n") # MeCabによる日本語テキストのトークナイザー関数を定義(名詞のみ抽出) def mecab_tokenizer(text): replaced_text = text.lower() path = "-d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd" mecab = MeCab.Tagger(path) parsed_lines = mecab.parse(replaced_text).split("\n")[:-2] # 原形を取得 token_list = [l.split("\t")[1].split(",")[6] for l in parsed_lines] # 品詞を取得 pos = [l.split('\t')[1].split(",")[0] for l in parsed_lines] # 名詞のみを対象 target_pos = ["名詞"] token_list = [t for t, p in zip(token_list, pos) if p in target_pos] # stopwordsの除去 token_list = [t for t in token_list if t not in stopwords] # ひらがなのみの単語を除く kana_re = re.compile("^[ぁ-ゖ]+$") token_list = [t for t in token_list if not kana_re.match(t)] # 英字が含まれる名詞を除外 english_re = re.compile("[a-zA-Z]") token_list = [t for t in token_list if not english_re.search(t)] # '*'や空文字列も除去 token_list = [t for t, p in zip(token_list, pos) if p in target_pos and t != '*' and t != '' and t !='・'] return token_list # UMAPの埋め込みモデルのインスタンスを作成(ランダムシードを設定) umap_model = UMAP(n_neighbors=15, n_components=5, metric='cosine', random_state=SEED) # KMeansクラスタリングを用いたモデルの作成(トピック数を固定) kmeans_model = KMeans(n_clusters=5, random_state=SEED) # トピック数をに固定 # BERTopic用にカスタムトークナイザーを設定 vectorizer_model = CountVectorizer(tokenizer=mecab_tokenizer, max_features=3000, min_df=3, max_df=0.80) # BERTopicのインスタンスを作成 topic_model = BERTopic(vectorizer_model=vectorizer_model, embedding_model=umap_model, hdbscan_model=kmeans_model, language="japanese") # トピックモデルの生成 topics, probs = topic_model.fit_transform(texts) # トピックの概要を表示 print(topic_model.get_topic_info()) # トピックごとのキーワードを確認 for topic in topic_model.get_topics().values(): print(topic) コード

上記のコードを実行すると結果が実行ごとに異なります。
実行結果を一定にしたいです。対処法はありますでしょうか。

イメージ説明

イメージ説明

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/11/25 06:30

BERTopic/bertopic/_bertopic.py at master · MaartenGr/BERTopic https://github.com/MaartenGr/BERTopic/blob/master/bertopic/_bertopic.py#L146 BERTopic クラスのコンストラクタに umap_model を指定する attribute があります。 umap_model: UMAP = None なので、embedding_model=umap_model ではなく、umap_model=umap_model を指定するとよいかもしれません。 # BERTopicのインスタンスを作成 #topic_model = BERTopic(vectorizer_model=vectorizer_model, embedding_model=umap_model, hdbscan_model=kmeans_model, language="japanese") topic_model = BERTopic(vectorizer_model=vectorizer_model, umap_model=umap_model, hdbscan_model=kmeans_model, language="japanese")
otetsu04310431

2024/11/26 13:34 編集

コメントありがとうございます。試したところ問題が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか? 毎回ありがとうございます。
guest

回答1

0

ベストアンサー

ソースコードを確認すると、BERTopic クラスのコンストラクタに umap_model を指定する attribute があります。

BERTopic/bertopic/_bertopic.py at master · MaartenGr/BERTopic

python

1umap_model: UMAP = None

なので、embedding_model=umap_model ではなく、umap_model=umap_model を指定するとよいかと思います。

python

1# BERTopicのインスタンスを作成 2#topic_model = BERTopic(vectorizer_model=vectorizer_model, embedding_model=umap_model, hdbscan_model=kmeans_model, language="japanese") 3topic_model = BERTopic(vectorizer_model=vectorizer_model, umap_model=umap_model, hdbscan_model=kmeans_model, language="japanese")

投稿2024/11/26 13:41

melian

総合スコア20721

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otetsu04310431

2024/11/29 05:27

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問