見出し画像

[趣味研究]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でなんか


この記事が気に入ったらサポートをしてみませんか?