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) コード
上記のコードを実行すると結果が実行ごとに異なります。
実行結果を一定にしたいです。対処法はありますでしょうか。
回答1件
あなたの回答
tips
プレビュー