[PYTHON] "Liberté" en AKB48 et Nogizaka46 pratiquée en word2vec

introduction

En apprenant les paroles de AKB48 et Nogisaka46 respectivement en utilisant word2vec de la bibliothèque Python, j'ai recherché des mots similaires à "liberté" dans les paroles de AKB48 et Nogisaka46 respectivement. Ici, le traitement est principalement effectué par 6 programmes. Tout d'abord, j'obtiens le titre et l'ID de la chanson pour obtenir les paroles de AKB48 et Nogisaka46 d'Uta Net (https://www.uta-net.com/). Ensuite, l'ID est utilisé pour obtenir les paroles de chaque chanson. Après cela, MeCab est utilisé pour l'analyse morphologique et le traitement des mots vides. Ensuite, les données d'analyse morphologique sont agrégées pour confirmer le type de mots souvent utilisés. Ensuite, un modèle d'apprentissage est créé à l'aide de word2vec à partir des données analysées morphologiquement. Enfin, j'ai essayé d'extraire des mots similaires à «liberté» du modèle d'apprentissage.

Environnement requis pour exécuter ce programme

Des bibliothèques telles que BeautifulSoup et gensim sont installées. (Des packages tels que anaconda sont recommandés, seul le gensim doit être installé séparément)

L'environnement dans lequel mecab peut être utilisé avec python est en place et un dictionnaire tel que mecab-ipadic-NEologd est inclus.

Le programme présenté ici peut être exécuté avec "nom de fichier python.py" sur la ligne de commande.

Flux principal du programme

Cette analyse peut être traitée en exécutant 6 programmes dans l'ordre pour chacun des AKB48 et Nogisaka46 suivants.

Similaire à "liberté" dans AKB48

Tout d'abord, je voudrais extraire le mot similaire pour «liberté» dans AKB48. Comme expliqué précédemment, le processus consiste ici à acquérir l'ID et le titre du réseau de chansons, à acquérir les paroles, à effectuer une analyse morphologique et à créer un modèle d'apprentissage avec word2vec.

Paroles de Scraping AKB48

Comme les données utilisées pour l'apprentissage dans cette analyse, je voudrais utiliser les paroles de toutes les chansons d'AKB48 qui ont été annoncées jusqu'à présent. Sur le réseau de chansons, il y a des paroles de chansons pour chaque artiste, donc je vais gratter les paroles d'ici. En regardant le site Web de la chanson, la page où les paroles sont publiées est faite avec ID, donc pour obtenir l'ID de cette chanson, d'abord à partir de la page où vous pouvez lister les chansons de AKB48, l'ID de la chanson Gratter le titre. Vous pouvez utiliser cet identifiant pour obtenir les paroles de chaque chanson.

Obtenez l'ID du titre de la chanson de AKB48

Dans le programme suivant, l'identifiant et le titre de la chanson sont récupérés à l'aide de l'URL qui restreint uniquement les chansons AKB48 du réseau de chansons. Le processus est exécuté jusqu'à ce que les données acquises soient écrites dans un fichier appelé akb48_id.csv.

scraping_akb48_id.py


# -*- coding:utf-8 -*-
import csv
import requests
import codecs
from bs4 import BeautifulSoup

f = codecs.open('akb48_id.csv', 'w', 'utf-8')
f.write("code,title" "\n")

target_url = 'https://www.uta-net.com/search/?Aselect=1&Bselect=3&Keyword=AKB48&sort=&pnum={0}'

for i in range(1, 4):
    r = requests.get(target_url.format(i))
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib')
    codes = soup.find_all('td',{'class':'side td1'})
    titles = soup.find_all('td',{'class':'side td1'})


    for code, title in zip(codes, titles):
        print(code.find('a').attrs['href'][6:].replace("/", ''), title.text)
        f.write(str(code.find('a').attrs['href'][6:].replace("/", '')) + ',' + title.text + "\n")


f.close()

Obtenir les paroles de l'ID du titre de la chanson AKB48

Les données textuelles des paroles sont grattées à l'aide de l'ID de la chanson obtenue dans le programme précédent. Les données texte acquises sont écrites dans un fichier appelé akb48_lyrics.csv.

scraping_akb48_lyrics.py


# -*- coding:utf-8 -*-
import csv
import requests
import codecs
from bs4 import BeautifulSoup
import pandas as pd

f = codecs.open('akb48_lyrics.csv', 'w', 'utf-8')
f.write("lyrics" "\n")

target_url = 'https://www.uta-net.com/song/{0}/'

akb48_01 = pd.read_csv('akb48_id.csv',dtype = 'object')
akb48_02 = akb48_01["code"].values.tolist()

for i in akb48_02:
    r = requests.get(target_url.format(i))
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib')
    lyrics = soup.find_all('div',{'id':'kashi_area'})

    for lyric in lyrics:

        print(lyric.text.replace(",", ''))

        f.write(str(lyric.text.replace(",", '') + "\n"))


f.close()

Analyse morphologique des paroles d'AKB48

Ensuite, les données textuelles des paroles acquises sont analysées morphologiquement pour obtenir des données correspondant à la génération de modèle de word2vec. Lorsque vous étudiez avec word2vec, il doit être sous la forme d'espaces de mots. Par conséquent, les données analysées morphologiquement sont traitées de manière à être séparées par des espaces. Le traitement de mots vides est le traitement pour extraire uniquement la nomenclature, les adjectifs, les verbes et les compléments. Les données analysées morphologiquement sont sorties sous forme de fichier appelé akb48_wakati.txt.

akb48_mecab.py


import MeCab

lyrics = open('akb48_lyrics.csv', 'r')
text = lyrics.readlines()

def extractKeyword(line):
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(line)
    keywords = []
    while node:
        if node.feature.split(",")[0] == u"nom":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"adjectif":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"verbe":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"adverbe":
             keywords.append(node.surface)
        node = node.next
    return keywords

import codecs
import re
f = codecs.open('akb48_wakati.txt', 'w', 'utf-8')
single =  r"^[Ah-Hmm]$"

for line in text:
    kekka = extractKeyword(line)
    wakati = ' '.join(kekka)
    re_wakati1 = wakati.split()

    for line2 in re_wakati1:
        if re.match(single,line2):
            re_wakati2 = ""
        elif len(line2.encode('utf-8')) < 3:
            re_wakati2 = ""
        else:
            re_wakati2 = line2
        print(re_wakati2,end=" ")
        f.write(re_wakati2)
        f.write(" ")
    print("\n")
    f.write("\n")
f.close()

Agrégation de données textuelles analysées morphologiquement (AKB48)

Le traitement ici n'est pas directement lié à cette analyse, vous pouvez donc l'ignorer. Pour le moment, je le fais pour confirmer quels types de mots sont réellement utilisés dans le texte analysé morphologiquement. Vous pouvez voir que le mot «liberté» que je vais chercher cette fois est également utilisé 75 fois. Je pense que vous pouvez sortir ce processus d'agrégation plus facilement en utilisant des pandas.

akb48_count.py


f = open('akb48_wakati.txt')
lines2 = f.readlines()
f.close()

import codecs
f = codecs.open('akb48_count.txt', 'w', 'utf-8')

words =[]
for line in lines2:
    line3 = line.replace(" ", "\n")
    f.write(line3)
f.close()

f = open('akb48_count.txt')
lines2 = f.read()
f.close()

lines3 = lines2.split()

import collections
words = collections.Counter(lines3)

print(words.most_common())

Création de modèles à partir de paroles avec word2vec (AKB48)

C'est le programme d'apprentissage. Je crée un modèle d'apprentissage avec word2vec en utilisant les données de texte séparées par des espaces qui ont été analysées pour la morphologie. Le résultat de l'apprentissage différera en fonction des paramètres tels que size, min_count et window, il est donc recommandé de modifier les paramètres plusieurs fois. Le modèle d'apprentissage créé est enregistré dans un fichier appelé akb48.model.

akb48_word2vec.py


from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('akb48_wakati.txt')

model = word2vec.Word2Vec(sentences, size=100, min_count=5, window=10, hs=1, sg=1, seed=100)
model.save("akb48.model")

Extraire des mots similaires à "liberté" (AKB48)

Enfin, en utilisant le modèle d'apprentissage que nous avons créé plus tôt, nous extrayons des mots similaires au mot «liberté». Si topn est spécifié, des mots similaires en haut seront affichés.

akb48_word2vec_model.py


from gensim.models import word2vec

model = word2vec.Word2Vec.load("akb48.model")
results = model.wv.most_similar(positive=["liberté"], topn=20)
for result in results:
    print(result)

Résultat de sortie (AKB48)

Monde 0.5644636154174805
Surfer sur le vent 0.5584157705307007
Paradis 0.5396431088447571
Aiya 0.5267466902732849
Voler 0.521303117275238
Halloween 0.5185834765434265
Peut voler 0.5173347592353821
Danse 0.4997383952140808
Attaché 0.4945579767227173
Bon 0.4936122000217438
Risque 0.49195727705955505
Règle 0.4813954532146454
Aiyaiyai 0.472299188375473
Volé 0.45674586296081543
Pas 0.4543856084346771
Stupide 0.4531818926334381
Avoir 0.4521175026893616
Teru 0.44793424010276794
Sonnerie 0.436395525932312
Loin 0.4335517883300781

Un synonyme de «liberté» à Nogizaka46

Ensuite, je voudrais extraire un mot similaire pour «liberté» à Nogisaka 46. Le processus ici est le même que le processus effectué à AKB48 plus tôt, comme l'acquisition de l'ID et du titre à partir du réseau de chansons, l'acquisition des paroles, l'exécution d'une analyse morphologique et la création d'un modèle d'apprentissage avec word2vec. Je suis.

Gratter les paroles de Nogizaka46

Comme données utilisées pour l'apprentissage dans cette analyse, je voudrais utiliser les paroles de toutes les chansons de Nogisaka 46 qui ont été annoncées jusqu'à présent. Sur le réseau de chansons, il y a des paroles de chansons pour chaque artiste, donc je vais gratter les paroles d'ici. En regardant le site Web de la chanson, la page où les paroles sont publiées est faite avec ID, donc pour obtenir l'ID de cette chanson, d'abord à partir de la page où vous pouvez lister les chansons de Nogisaka 46, l'ID de la chanson Et grattant le titre. Vous pouvez utiliser cet identifiant pour obtenir les paroles de chaque chanson.

Obtenez l'ID du titre de la chanson de Nogisaka 46

Dans le programme suivant, l'ID de la chanson et le titre de la chanson sont grattés à l'aide de l'URL qui restreint uniquement les chansons de Nogisaka 46 du réseau de chansons. Le processus est exécuté jusqu'à ce que les données acquises soient écrites dans un fichier appelé nogi46_id.csv.

scraping_nogizaka46_id.py


# -*- coding:utf-8 -*-
import csv
import requests
import codecs
from bs4 import BeautifulSoup

f = codecs.open('nogi46_id.csv', 'w', 'utf-8')
f.write("code,title" "\n")

target_url = 'https://www.uta-net.com/search/?Keyword=%E4%B9%83%E6%9C%A8%E5%9D%8246&x=0&y=0&Aselect=1&Bselect={0}'

for i in range(1, 2):
    r = requests.get(target_url.format(i))         #Obtenez du Web à l'aide de demandes
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib') #Extraire des éléments
    codes = soup.find_all('td',{'class':'side td1'})
    titles = soup.find_all('td',{'class':'side td1'})


    for code, title in zip(codes, titles):
        print(code.find('a').attrs['href'][6:].replace("/", ''), title.text)
        f.write(str(code.find('a').attrs['href'][6:].replace("/", '')) + ',' + title.text + "\n")


f.close()

Obtenir les paroles de l'identifiant du titre de la chanson de Nogizaka46

Les données textuelles des paroles sont grattées à l'aide de l'ID de la chanson obtenue dans le programme précédent. Les données texte acquises sont écrites dans un fichier appelé nogi46_lyrics.csv.

scraping_nogizaka46_lyrics.py


# -*- coding:utf-8 -*-
import csv
import requests
import codecs
from bs4 import BeautifulSoup
import pandas as pd

f = codecs.open('nogi46_lyrics.csv', 'w', 'utf-8')
f.write("lyrics" "\n")

target_url = 'https://www.uta-net.com/song/{0}/'

nogi46_01 = pd.read_csv('nogi46_id.csv',dtype = 'object')
nogi46_02 = nogi46_01["code"].values.tolist()

for i in nogi46_02:
    r = requests.get(target_url.format(i))         #Obtenez du Web à l'aide de demandes
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib') #Extraire des éléments
    lyrics = soup.find_all('div',{'id':'kashi_area'})

    for lyric in lyrics:

        print(lyric.text.replace(",", ''))

        f.write(str(lyric.text.replace(",", '') + "\n"))


f.close()

Analyse morphologique des paroles de Nogizaka46

Ensuite, les données textuelles des paroles acquises sont analysées morphologiquement pour obtenir des données correspondant à la génération de modèle de word2vec. Lorsque vous étudiez avec word2vec, il doit être sous la forme d'espaces de mots. Par conséquent, les données analysées morphologiquement sont traitées de manière à être séparées par des espaces. Le traitement de mots vides est le traitement pour extraire uniquement la nomenclature, les adjectifs, les verbes et les compléments. Les données analysées morphologiquement sont sorties sous la forme d'un fichier appelé nogi46_wakati.txt.

nogizaka46_mecab.py


import MeCab

lyrics = open('nogi46_lyrics.csv', 'r')
text = lyrics.readlines()

def extractKeyword(line):
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(line)
    keywords = []
    while node:
        if node.feature.split(",")[0] == u"nom":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"adjectif":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"verbe":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"adverbe":
             keywords.append(node.surface)
        node = node.next
    return keywords

import codecs
import re
f = codecs.open('nogi46_wakati.txt', 'w', 'utf-8')
single =  r"^[Ah-Hmm]$"

for line in text:
    kekka = extractKeyword(line)
    wakati = ' '.join(kekka)
    re_wakati1 = wakati.split()

    for line2 in re_wakati1:
        if re.match(single,line2):
            re_wakati2 = ""
        elif len(line2.encode('utf-8')) < 3:
            re_wakati2 = ""
        else:
            re_wakati2 = line2
        print(re_wakati2,end=" ")
        f.write(re_wakati2)
        f.write(" ")
    print("\n")
    f.write("\n")
f.close()

Agrégation de données textuelles analysées morphologiquement (Nogisaka 46)

Le traitement ici n'est pas directement lié à cette analyse, vous pouvez donc l'ignorer. Pour le moment, je le fais pour confirmer quels types de mots sont réellement utilisés dans le texte analysé morphologiquement. Vous pouvez voir que le mot «liberté» que je vais chercher cette fois est également utilisé 60 fois. Je pense que vous pouvez sortir ce processus d'agrégation plus facilement en utilisant des pandas.

nogizaka46_count.py


f = open('nogi46_wakati.txt')
lines2 = f.readlines()
f.close()

import codecs
f = codecs.open('nogizaka46_count.txt', 'w', 'utf-8')

words =[]
for line in lines2:
    line3 = line.replace(" ", "\n")
    f.write(line3)
f.close()

f = open('nogizaka46_count.txt')
lines2 = f.read()
f.close()

lines3 = lines2.split()

import collections
words = collections.Counter(lines3)

print(words.most_common())

Créer un modèle à partir de paroles avec word2vec (Nogisaka 46)

C'est le programme d'apprentissage. Je crée un modèle d'apprentissage avec word2vec en utilisant les données de texte séparées par des espaces qui ont été analysées pour la morphologie. Le résultat de l'apprentissage différera en fonction des paramètres tels que size, min_count et window, il est donc recommandé de modifier les paramètres plusieurs fois. Le modèle d'apprentissage créé est enregistré dans un fichier appelé nogizaka46.model.

nogizaka46_word2vec.py


from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('nogi46_wakati.txt')

model = word2vec.Word2Vec(sentences, size=100, min_count=5, window=10, hs=1, sg=1, seed=100)
model.save("nogizaka46.model")

Extraire des mots similaires à "liberté"

Enfin, en utilisant le modèle d'apprentissage que nous avons créé plus tôt, nous extrayons des mots similaires au mot «liberté». Si topn est spécifié, des mots similaires en haut seront affichés.

nogizaka46_word2vec_model.py


from gensim.models import word2vec

model = word2vec.Word2Vec.load("nogizaka46.model")
results = model.wv.most_similar(positive=["liberté"], topn=20)
for result in results:
    print(result)

Résultat de sortie (Nogisaka 46)

Privilège 0.6652380228042603
Décoller 0.6220737099647522
Naro 0.5961438417434692
Début 0.5454341173171997
Bordure 0.45137685537338257
Rechercher 0.44773566722869873
Get 0.4456521272659302
Obligatoire 0.44296208024024963
Amis 0.4364272952079773
Recevoir 0.4297247529029846
Avance 0.4280410706996918
Ciel 0.4277403652667999
Jeunesse 0.422186940908432
Bordure 0.42211493849754333
Uniforme 0.4201713502407074
Discotique 0.4199380874633789
Frapper 0.41815412044525146
Takumi 0.4154769778251648
Lève-toi 0.412681519985199
Les filles parlent 0.40724512934684753

résultat de l'analyse

AKB48 a une impression de message comme "monde", "chevaucher le vent" et "paradis", et Nogisaka 46 a des mots remarquables avec une vue à vol d'oiseau comme "privilège", "frontière" et "frontière". C'était.

AKB48 Similitude cosinus Nogizaka 46 Similitude cosinus
monde 0.5644636154174805 Privilège 0.6652380228042603
Surfer sur le vent 0.5584157705307007 Décollage 0.6220737099647522
paradis 0.5396431088447571 Naro 0.5961438417434692
Aiya 0.5267466902732849 début 0.5454341173171997
sauter 0.521303117275238 Frontière 0.45137685537338257
Halloween 0.5185834765434265 Chercher 0.44773566722869873
Peut voler 0.5173347592353821 Get 0.4456521272659302
Danse 0.4997383952140808 nécessaire 0.44296208024024963
Attaché 0.4945579767227173 copains 0.4364272952079773
Bien 0.4936122000217438 recevoir 0.4297247529029846
risque 0.49195727705955505 Avance 0.4280410706996918
règle 0.4813954532146454 Ciel 0.4277403652667999
Je n'aime pas ça 0.472299188375473 Jeunesse 0.422186940908432
Volé 0.45674586296081543 frontière 0.42211493849754333
Absent 0.4543856084346771 uniforme 0.4201713502407074
Stupide 0.4531818926334381 Discotique 0.4199380874633789
Avoir 0.4521175026893616 frappe 0.41815412044525146
Teru 0.44793424010276794 Pionnier 0.4154769778251648
Réverbérer 0.436395525932312 Se lever 0.412681519985199
loin 0.4335517883300781 Les filles parlent 0.40724512934684753

référence

"OK word2vec! Dites-moi la signification de" sérieusement "" J'ai essayé de pratiquer word2vec avec Python

Recommended Posts

"Liberté" en AKB48 et Nogizaka46 pratiquée en word2vec