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.
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.
Cette analyse peut être traitée en exécutant 6 programmes dans l'ordre pour chacun des AKB48 et Nogisaka46 suivants.
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.
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.
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()
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()
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()
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())
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")
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)
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
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.
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.
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()
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()
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()
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())
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")
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)
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
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 |
Recommended Posts