[PYTHON] J'ai essayé de vectoriser les paroles de Hinatazaka 46!

0: ce que vous voulez faire

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.

Qu'est-ce que Word2vec?

** Magie pour convertir les mots en vecteurs **

image.png

** Comment les mots se transforment-ils en vecteurs? ** ** image.png

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.

Flux de traitement du langage naturel

自然言語処理の流れ

1: Collecte de données

Collectez des données en fonction de la tâche que vous souhaitez résoudre

2: processus de nettoyage

Supprimer les bruits inutiles tels que les balises HTML ・ ** Belle soupe ** ・ ** Module de bibliothèque standard **

1,2: Collecte de données et processus de nettoyage

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

3: Normalisation des mots

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 **

4: Analyse morphologique (division des mots)

Divisez les phrases mot par mot ・ ** MeCab ** ・ ** Janome ** ・ ** Juman +++

5: Conversion en forme de base

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.

4,5: Analyse morphologique (division des mots) et conversion en 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]]
自然言語処理の流れ

6: Arrêter la suppression des mots

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

7: numériser les mots

Conversion d'une chaîne de caractères en valeur numérique afin qu'elle puisse être gérée par l'apprentissage automatique

8: Apprentissage du modèle

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.

7,8: Numérisation de mots et apprentissage de modèles

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))
自然言語処理の流れ

Degré de similitude

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.

自然言語処理の流れ

[Aperçu]

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

Les références

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

J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé de toucher l'API COTOHA
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
J'ai essayé d'informer Slack de la mise à jour de Redmine
J'ai essayé d'optimiser le séchage du linge
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
Qiita Job J'ai essayé d'analyser le travail
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé d'utiliser le filtre d'image d'OpenCV
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.