En utilisant ** word2vec ** basé sur les données des paroles de toutes les chansons de Hinatazaka 46, ** Langage naturel ⇒ Valeur numérique ** Je voudrais le convertir et jouer avec.
** Magie pour convertir les mots en vecteurs **
** Comment les mots se transforment-ils en vecteurs? ** **
Les poids W, W "sont calculés en utilisant les mots autour du mot d'entrée (** cette fois, la distance est 1 **) comme données de l'enseignant. Le poids calculé W représente le vecteur de chaque mot.
Collectez des données en fonction de la tâche que vous souhaitez résoudre
Supprimer les bruits inutiles tels que les balises HTML ・ ** Belle soupe ** ・ ** Module de bibliothèque standard **
#1.Grattage
import requests
from bs4 import BeautifulSoup
import warnings
warnings.filterwarnings('ignore')
target_url = "https://www.uta-net.com/search/?Aselect=1&Keyword=%E6%97%A5%E5%90%91%E5%9D%82&Bselect=3&x=0&y=0"
r = requests.get(target_url)
soup = BeautifulSoup(r.text,"html.parser")
music_list = soup.find_all('td', class_='side td1')
url_list = [] #Extrayez l'URL de chaque nom de chanson de la liste des chansons et mettez-la dans la liste
for elem in music_list:
a = elem.find("a")
b = a.attrs['href']
url_list.append(b)
#<td class="side td1">
# <a href="/song/291307/"> Azato Kawaii </a>
#</td>
#<td class="side td1">
# <a href="/song/250797/"> Mal à l'aise et grandi </a>
#</td>
hinataza_kashi = "" #Envoyer une demande pour chaque chanson et extraire les paroles
base_url = "https://www.uta-net.com"
for i in range(len(url_list)):
target_url = base_url + url_list[i]
r = requests.get(target_url)
soup = BeautifulSoup(r.text,"html.parser")
div_list = soup.find_all("div", id = "kashi_area")
for i in div_list:
tmp = i.text
hinatazaka_kashi += tmp
#<div id="kashi_area" itemprop="text">
#J'ai été attrapé(Ouais en un coup d'oeil, Yeah, Yeah)
#<br>
#Je suis tombé amoureux sans permission
#<br>
#Ce n'est pas de ta faute
#Prétraitement(Supprimer l'anglais et les symboles avec des expressions régulières)
import re
kashi=re.sub("[a-xA-Z0-9_]","",hinatazaka_kashi)#Supprimer les caractères alphanumériques
kashi=re.sub("[!-/:-@[-`{-~]","",kashi)#Supprimer le symbole
kashi=re.sub(u"\n\n","\n",kashi)#Supprimer les sauts de ligne
kashi=re.sub(u"\r","",kashi)#Supprimer les blancs
kashi=re.sub(u"\u3000","",kashi)#Supprimez les blancs pleine largeur
kashi=kashi.replace(' ','')
kashi=kashi.replace(' ','')
kashi=kashi.replace('?','')
kashi=kashi.replace('。','')
kashi=kashi.replace('…','')
kashi=kashi.replace('!','')
kashi=kashi.replace('!','')
kashi=kashi.replace('「','')
kashi=kashi.replace('」','')
kashi=kashi.replace('y','')
kashi=kashi.replace('“','')
kashi=kashi.replace('”','')
kashi=kashi.replace('、','')
kashi=kashi.replace('・','')
kashi=kashi.replace('\u3000','')
with open("hinatazaka_kashi_1.txt",mode="w",encoding="utf-8") as fw:
fw.write(kashi)
Unifier demi-largeur, pleine largeur, minuscules et majuscules, etc. ・ ** En envoyant un pseudonyme ** "Faire" et "Faire" "Réception" et "Réception"
・ ** Type de caractère ** «Apple» et «Apple» "Chien", "Inu" et "Chien"
· ** Majuscule et minuscule ** Pomme et pomme
** * Ignorer cette fois **
Divisez les phrases mot par mot ・ ** MeCab ** ・ ** Janome ** ・ ** Juman +++
Unifier au mot radical (la partie qui n'est pas utilisée) Exemple: Apprendre → Apprendre Dans les mises en œuvre récentes, il ne peut pas être converti en la forme de base.
path="hinatazaka_kashi_1.txt"
f = open(path,encoding="utf-8")
data = f.read() #Renvoie toutes les données lues jusqu'à la fin du fichier
f.close()
#3.Analyse morphologique
import MeCab
text = data
m = MeCab.Tagger("-Ochasen")#Instanciation de tagger pour l'analyse du texte
nouns = [line for line in m.parse(text).splitlines()#L'utilisation de la méthode parse de la classe Tagger renvoie le résultat de l'analyse morphologique du texte
if "nom" or "Verbe adjectif" or "adjectif" or"Verbe adjectif" or "verbe" or "固有nom" in line.split()[-1]]
nouns = [line.split()[0] for line in m.parse(text).splitlines()
if "nom" or "Verbe adjectif" or "adjectif" or "Verbe adjectif" or "verbe" or "固有nom" in line.split()[-1]]
Supprimez les mots inutiles, tels que les mots qui apparaissent trop souvent Il ne peut pas être supprimé dans les implémentations récentes
my_stop_word=["Faire","Teru","Devenir","Est","chose","de","Hmm","y","un","Sa","alors","Être","Bien","y a-t-il","Yo","もde","Absent","Finir",
"Être","Donnez-moi","De","je me demande","Cette","mais","Seulement","Un","main","Jusqu'à ce que","Unmain","À plus","Vouloir","Si","Tara","Sans pour autant","Être","Tel quel","Taku"]
nouns_new=[]
for i in nouns:
if i in my_stop_word:
continue
else:
nouns_new.append(i)
import codecs
with codecs.open("hinatazaka_kashi_2.txt", "w", "utf-8") as f:
f.write("\n".join(nouns_new))
Conversion d'une chaîne de caractères en valeur numérique afin qu'elle puisse être gérée par l'apprentissage automatique
Machine learning classique ~ Sélectionnez un réseau neuronal en fonction de votre tâche Maintenant, saisissons ce qui correspond au prétraitement dans ce flux.
from gensim.models import word2vec
corpus = word2vec.LineSentence("hinatazaka_kashi_2.txt")
model = word2vec.Word2Vec(corpus, size=100 ,min_count=3,window=5,iter=30)
model.save("hinatazaka.model")
model = word2vec.Word2Vec.load("hinatazaka.model")
#Voir les mots similaires au pilote
print('Top 10 des mots liés aux likes')
similar_words = model.wv.most_similar(positive=[u"Comme"], topn=10)
for key,value in similar_words:
print('{}\t\t{:.2f}'.format(key, value))
print('-----')
# #Calculez la similitude entre deux mots
similarity = model.wv.similarity(w1=u"Sourire", w2=u"été")
print('Similitude entre «sourire» et «été»=>' + str(similarity))
similarity = model.wv.similarity(w1=u"ami", w2=u"été")
print("Similitude entre «amis» et «été»=>" + str(similarity))
similarity = model.wv.similarity(w1=u"fille", w2=u"Homme")
print('Similitude entre «fille» et «homme»=>' + str(similarity))
La similitude qui apparaît ici est ** cos similarity **. Pour faire simple, cos similarité est une valeur numérique de combien deux vecteurs pointent dans la même direction (similarité). Une similitude cos de 0 indique une similitude faible, et une similitude cos de 1 indique une similitude faible. La similitude cos est exprimée par la formule suivante.
*** "Papa Duwa Duwa Duwa Duwa Duwa Duwa Duwa Papa Papa" *** Qu'est-ce que c'est? Si vous obtenez les données du blog du membre au lieu des paroles, vous pouvez voir à quel point les membres sont proches. (Essayons la prochaine fois ...)
1: Bases du traitement du langage naturel (TensorFlow)
2: [uepon daily memorandum] (https://uepon.hatenadiary.com/entry/2019/02/10/150804)
3: [Classe d'analyse de données Np-Ur] (https://www.randpy.tokyo/entry/word2vec_skip_gram_model)
Recommended Posts