[趣味研究]Youtubeコメント分析#2:学習済みWord2Vec
前回の記事
今回の目的
内容面
①元コメントへのリプライを分析をしたいと思います。コメントの方が、批判/擁護の色がでやすいかなっていう予想です。
技術面
②学習済みの日本語Word2Vecを使ってみる
データ
例によってスクレイピングのコードはお見せできないのですが、代わりにデータの表を示しておきます。前回のデータでコメントは合計10万件くらいありましたが、リプがついたコメントは1.2万件くらいなのでおよそ全コメントの1/8しかリプがついてないっぽいですね。
*書いてて思いましたが、「リプがついたコメント」と「ついてないコメント」の
メソッド
以下の記事を参考にしました。。Word2Vecの仕組みの勉強にもなるいい記事だと思います。学習済みモデルは重いのでGoogle colabでの実行が可能なコードは助かります
今回のコード(tokenized_textsは前回の記事と同様にリプライを分かち書きしました)
!wget https://github.com/singletongue/WikiEntVec/releases/download/20190520/jawiki.word_vectors.200d.txt.bz2
!bzip2 -d jawiki.word_vectors.200d.txt.bz2
# モデルを読み込む
from gensim import models
w2v_model = models.KeyedVectors.load_word2vec_format('jawiki.word_vectors.200d.txt', binary=False)
# 各文書をベクトル化する
document_vectors = []
for text in tokenized_texts:
vectors = []
for word in text:
if word in w2v_model:
vectors.append(w2v_model[word])
if vectors:
document_vectors.append(np.mean(vectors, axis=0))
else:
# ベクトルが得られない場合は、ランダムなベクトルを使用
document_vectors.append(np.random.uniform(-0.25, 0.25, w2v_model.vector_size))
# K-meansクラスタリングを適用する
num_clusters = 3 # クラスタの数を指定
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
clusters = kmeans.fit_predict(document_vectors)
# クラスタリングの結果を表示する
for i in range(num_clusters):
print("Cluster", i+1, ":")
for j, text in enumerate(tokenized_texts):
if clusters[j] == i:
print(text)
print()
from mpl_toolkits.mplot3d import Axes3D
# UMAPを使用してベクトルを3次元空間にマッピングする
reducer_3d = umap.UMAP(n_components=3, random_state=42)
embedding_3d = reducer_3d.fit_transform(document_vectors)
# クラスタリングの可視化(3次元)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
for i in range(num_clusters):
ax.scatter(embedding_3d[clusters == i, 0], embedding_3d[clusters == i, 1], embedding_3d[clusters == i, 2], label=f'Cluster {i+1}')
ax.set_title('UMAP Clustering Visualization (3D)')
ax.set_xlabel('UMAP Dimension 1')
ax.set_ylabel('UMAP Dimension 2')
ax.set_zlabel('UMAP Dimension 3')
ax.legend()
plt.show()
リザルト
単語の類似度を前回と比較してみましょう
やはり前回のYoutubeについたコメントのものよりも一般的な類似度になっていますね。
また全然、クラスター分かれてない(泣)。ただどのリプもなんかZ軸が極端に低いらしい。
今後
・Z軸が何か特定してみる(タグ付けが必要?)
・学習済みモデルと自前のモデルを組み合わせる
・どういうコメントにリプが付きやすいのか
・コメントとリプの関係(極性とか?)
・道徳基盤辞書を使った分析
・TF-IDFでなんか