[PYTHON] "Freiheit" in AKB48 und Nogizaka46 wurde in word2vec praktiziert

Einführung

Indem ich die Texte von AKB48 und Nogisaka46 mit word2vec aus der Python-Bibliothek lernte, suchte ich in den Texten von AKB48 und Nogisaka46 nach Wörtern, die "Freiheit" ähneln. Hier wird die Verarbeitung hauptsächlich von 6 Programmen durchgeführt. Zuerst erhalte ich den Titel und die ID des Songs, um die Texte von AKB48 und Nogisaka46 von Uta Net (https://www.uta-net.com/) zu erhalten. Als nächstes wird die ID verwendet, um die Texte für jedes Lied zu erhalten. Danach wird MeCab für die morphologische Analyse und die Stoppwortverarbeitung verwendet. Als nächstes werden morphologische Analysedaten aggregiert, um zu bestätigen, welche Art von Wörtern häufig verwendet werden. Anschließend wird mit word2vec aus den morphologisch analysierten Daten ein Lernmodell erstellt. Schließlich habe ich versucht, Wörter, die "Freiheit" ähneln, aus dem Lernmodell zu extrahieren.

Umgebung erforderlich, um dieses Programm auszuführen

Bibliotheken wie BeautifulSoup und gensim sind installiert. (Pakete wie Anaconda werden empfohlen, nur Gensim muss separat installiert werden.)

Die Umgebung, in der Mecab mit Python verwendet werden kann, ist vorhanden, und ein Wörterbuch wie Mecab-ipadic-NEologd ist enthalten.

Das hier vorgestellte Programm kann mit "python file name.py" in der Befehlszeile ausgeführt werden.

Hauptablauf des Programms

Diese Analyse kann verarbeitet werden, indem 6 Programme für jedes der folgenden AKB48 und Nogisaka46 ausgeführt werden.

--Schaben der ID und des Titels jedes Songs von AKB48 und Nogisaka46 aus dem Songnetz. --Schaben Sie die Texte von AKB48 und Nogisaka46 aus dem Songnetz.

Ähnlich wie "Freiheit" in AKB48

Zunächst möchte ich das ähnliche Wort für "Freiheit" in AKB48 extrahieren. Wie bereits erläutert, besteht der Prozess hier darin, die ID und den Titel aus dem Song-Netz abzurufen, die Texte abzurufen, morphologische Analysen durchzuführen und mit word2vec ein Lernmodell zu erstellen.

Scraping AKB48 Texte

Als Daten, die für das Lernen in dieser Analyse verwendet wurden, möchte ich die Texte aller bisher angekündigten Songs von AKB48 verwenden. Im Song-Netz gibt es Songtexte für jeden Künstler, daher werde ich die Songtexte von hier aus kratzen. Wenn Sie sich die Song-Website ansehen, wird die Seite, auf der die Texte veröffentlicht werden, mit einer ID erstellt. Um die ID dieses Songs zu erhalten, müssen Sie zunächst die Seite des AKB48, die ID des Songs, auflisten Titel kratzen. Sie können diese ID verwenden, um die Texte für jedes Lied zu erhalten.

Holen Sie sich die ID des Songtitels von AKB48

Im folgenden Programm werden die Song-ID und der Songtitel mithilfe der URL gelöscht, die nur die AKB48-Songs aus dem Song-Netz eingrenzt. Der Vorgang wird ausgeführt, bis die erfassten Daten als Datei mit dem Namen akb48_id.csv ausgeschrieben sind.

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()

Holen Sie sich Texte von AKB48 Songtitel ID

Die Textdaten der Texte werden mit der ID des im vorherigen Programm erhaltenen Songs abgekratzt. Die erfassten Textdaten werden in eine Datei namens akb48_lyrics.csv geschrieben.

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()

Morphologische Analyse von AKB48-Texten

Als nächstes werden die Textdaten der erfassten Texte morphologisch analysiert, um Daten zu erhalten, die der Modellgenerierung von word2vec entsprechen. Beim Lernen mit word2vec muss es in Form von Wortraumwörtern vorliegen. Daher werden die morphologisch analysierten Daten so verarbeitet, dass sie durch Leerzeichen getrennt sind. Bei der Stoppwortverarbeitung werden nur Nomenklaturen, Adjektive, Verben und Zusätze extrahiert. Die morphologisch analysierten Daten werden als Datei mit dem Namen akb48_wakati.txt ausgegeben.

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"Substantiv":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Adjektiv":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Verb":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Adverb":
             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()

Aggregation morphologisch analysierter Textdaten (AKB48)

Die Verarbeitung hier steht nicht in direktem Zusammenhang mit dieser Analyse, sodass Sie sie überspringen können. Zur Zeit mache ich es, um zu bestätigen, welche Art von Wörtern tatsächlich im morphologisch analysierten Text verwendet werden. Sie können sehen, dass das Wort "Freiheit", das ich dieses Mal nachschlagen werde, auch 75 Mal verwendet wird. Ich denke, dass Sie diesen Aggregationsprozess einfacher mit Pandas ausgeben können.

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())

Modellerstellung aus Texten mit word2vec (AKB48)

Dies ist das Lernprogramm. Ich erstelle ein Lernmodell mit word2vec unter Verwendung der durch Leerzeichen getrennten Textdaten, die auf Morphologie analysiert wurden. Das Lernergebnis hängt von den Parametern wie Größe, min_count und Fenster ab. Es wird daher empfohlen, die Parameter mehrmals zu ändern. Das erstellte Lernmodell wird als Datei mit dem Namen akb48.model gespeichert.

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")

Extrahieren Sie Wörter ähnlich wie "Freiheit" (AKB48)

Schließlich extrahieren wir mithilfe des zuvor erstellten Lernmodells Wörter, die dem Wort "Freiheit" ähnlich sind. Wenn topn angegeben ist, werden ähnliche Wörter oben ausgegeben.

akb48_word2vec_model.py


from gensim.models import word2vec

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

Ausgabeergebnis (AKB48)

Welt 0.5644636154174805
Den Wind reiten 0.5584157705307007
Paradies 0.5396431088447571
Aiya 0.5267466902732849
Fliege 0.521303117275238
Halloween 0.5185834765434265
Kann 0 fliegen.5173347592353821
Tanz 0.4997383952140808
Gebunden 0.4945579767227173
Gut 0.4936122000217438
Risiko 0.49195727705955505
Regel 0.4813954532146454
Aiyaiyai 0.472299188375473
0 ausgeraubt.45674586296081543
Nicht 0.4543856084346771
Dumm 0.4531818926334381
Habe 0.4521175026893616
Teru 0.44793424010276794
Klingeln 0.436395525932312
Weit 0.4335517883300781

Ein Synonym für "Freiheit" in Nogizaka46

Als nächstes möchte ich in Nogisaka 46 ein ähnliches Wort für "Freiheit" extrahieren. Der Prozess hier ist der gleiche wie der zuvor bei AKB48 durchgeführte Prozess, z. B. das Abrufen der ID und des Titels aus dem Songnetz, das Abrufen der Texte, das Durchführen einer morphologischen Analyse und das Erstellen eines Lernmodells mit word2vec. Ich bin.

Scraping die Texte von Nogizaka46

Als Daten für das Lernen in dieser Analyse möchte ich die Texte aller bisher angekündigten Songs von Nogisaka 46 verwenden. Im Song-Netz gibt es Songtexte für jeden Künstler, daher werde ich die Songtexte von hier aus kratzen. Wenn Sie sich die Website des Songs ansehen, wird die Seite, auf der die Texte veröffentlicht werden, mit einer ID erstellt. Um die ID dieses Songs zu erhalten, müssen Sie zunächst die Seite von Nogisaka 46, die ID des Songs, auflisten Und den Titel kratzen. Sie können diese ID verwenden, um die Texte für jedes Lied zu erhalten.

Holen Sie sich die ID des Songtitels von Nogisaka 46

Im folgenden Programm werden die ID des Songs und der Titel des Songs mithilfe der URL abgekratzt, die nur die Songs von Nogisaka 46 aus dem Songnetz eingrenzt. Der Vorgang wird ausgeführt, bis die erfassten Daten als Datei mit dem Namen nogi46_id.csv geschrieben wurden.

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))         #Holen Sie sich aus dem Web mit Anfragen
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib') #Elemente extrahieren
    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()

Holen Sie sich Texte aus Nogizaka46s Songtitel-ID

Die Textdaten der Texte werden mit der ID des im vorherigen Programm erhaltenen Songs abgekratzt. Die erfassten Textdaten werden in eine Datei namens nogi46_lyrics.csv geschrieben.

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))         #Holen Sie sich aus dem Web mit Anfragen
    req = requests.Request(r)
    soup = BeautifulSoup(r.text, 'html5lib') #Elemente extrahieren
    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()

Morphologische Analyse der Texte von Nogizaka46

Als nächstes werden die Textdaten der erfassten Texte morphologisch analysiert, um Daten zu erhalten, die der Modellgenerierung von word2vec entsprechen. Beim Lernen mit word2vec muss es in Form von Wortraumwörtern vorliegen. Daher werden die morphologisch analysierten Daten so verarbeitet, dass sie durch Leerzeichen getrennt sind. Bei der Stoppwortverarbeitung werden nur Nomenklaturen, Adjektive, Verben und Zusätze extrahiert. Die morphologisch analysierten Daten werden als Datei mit dem Namen nogi46_wakati.txt ausgegeben.

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"Substantiv":
            keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Adjektiv":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Verb":
             keywords.append(node.surface)
        elif node.feature.split(",")[0] == u"Adverb":
             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()

Aggregation morphologisch analysierter Textdaten (Nogisaka 46)

Die Verarbeitung hier steht nicht in direktem Zusammenhang mit dieser Analyse, sodass Sie sie überspringen können. Zur Zeit mache ich es, um zu bestätigen, welche Art von Wörtern tatsächlich im morphologisch analysierten Text verwendet werden. Sie können sehen, dass das Wort "Freiheit", das ich dieses Mal nachschlagen werde, auch 60 Mal verwendet wird. Ich denke, dass Sie diesen Aggregationsprozess einfacher mit Pandas ausgeben können.

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())

Erstellen Sie ein Modell aus Texten mit word2vec (Nogisaka 46)

Dies ist das Lernprogramm. Ich erstelle ein Lernmodell mit word2vec unter Verwendung der durch Leerzeichen getrennten Textdaten, die auf Morphologie analysiert wurden. Das Lernergebnis hängt von den Parametern wie Größe, min_count und Fenster ab. Es wird daher empfohlen, die Parameter mehrmals zu ändern. Das erstellte Lernmodell wird als Datei mit dem Namen nogizaka46.model gespeichert.

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")

Extrahieren Sie Wörter ähnlich wie "Freiheit"

Schließlich extrahieren wir mithilfe des zuvor erstellten Lernmodells Wörter, die dem Wort "Freiheit" ähnlich sind. Wenn topn angegeben ist, werden ähnliche Wörter oben ausgegeben.

nogizaka46_word2vec_model.py


from gensim.models import word2vec

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

Ausgabeergebnis (Nogisaka 46)

Privileg 0.6652380228042603
0 abheben.6220737099647522
Naro 0.5961438417434692
Starten Sie 0.5454341173171997
Rand 0.45137685537338257
0 nachschlagen.44773566722869873
Get 0.4456521272659302
Erforderlich 0.44296208024024963
Freunde 0.4364272952079773
Erhalte 0.4297247529029846
Fortschritt 0.4280410706996918
Himmel 0.4277403652667999
Jugend 0.422186940908432
Rand 0.42211493849754333
Uniform 0.4201713502407074
Diskotisch 0.4199380874633789
Klopfen Sie 0.41815412044525146
Takumi 0.4154769778251648
Steh auf 0.412681519985199
Mädchen reden 0.40724512934684753

Ergebnis der Analyse

AKB48 hat einen nachrichtenähnlichen Eindruck wie "Welt", "Reiten im Wind" und "Paradies", und Nogisaka 46 hat auffällige Wörter mit einer Vogelperspektive wie "Privileg", "Grenze" und "Grenze". Es war.

AKB48 Kosinusähnlichkeit Nogizaka 46 Kosinusähnlichkeit
Welt 0.5644636154174805 Privileg 0.6652380228042603
Den Wind reiten 0.5584157705307007 Ausziehen, starten, abheben, losfahren 0.6220737099647522
Paradies 0.5396431088447571 Naro 0.5961438417434692
Aiya 0.5267466902732849 Start 0.5454341173171997
springen 0.521303117275238 Rand 0.45137685537338257
Halloween 0.5185834765434265 Nachschlagen 0.44773566722869873
Kann fliegen 0.5173347592353821 Get 0.4456521272659302
Tanzen 0.4997383952140808 notwendig 0.44296208024024963
Gefesselt 0.4945579767227173 Freunde 0.4364272952079773
Gut 0.4936122000217438 erhalten 0.4297247529029846
Risiko 0.49195727705955505 Voraus 0.4280410706996918
Regel 0.4813954532146454 Himmel 0.4277403652667999
Ich mag es nicht 0.472299188375473 Jugend 0.422186940908432
Beraubt 0.45674586296081543 Rand 0.42211493849754333
Abwesend 0.4543856084346771 Uniform 0.4201713502407074
Blöd 0.4531818926334381 Diskotisch 0.4199380874633789
Haben 0.4521175026893616 klopfen 0.41815412044525146
Teru 0.44793424010276794 Pionier 0.4154769778251648
Nachhallen 0.436395525932312 Aufstehen 0.412681519985199
weit 0.4335517883300781 Mädchen reden 0.40724512934684753

Referenz

"OK word2vec! Sag mir die Bedeutung von" ernsthaft "" Ich habe versucht, word2vec mit Python zu üben

Recommended Posts

"Freiheit" in AKB48 und Nogizaka46 wurde in word2vec praktiziert