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.
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.
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.
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.
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.
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()
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()
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()
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())
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")
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)
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
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.
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.
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()
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()
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()
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())
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")
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)
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
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 |
"OK word2vec! Sag mir die Bedeutung von" ernsthaft "" Ich habe versucht, word2vec mit Python zu üben
Recommended Posts