[PYTHON] Je veux générer automatiquement un nom de groupe de metal moderne

introduction

Avez-vous déjà vécu l'expérience de "Je ne peux pas décider du nom de notre groupe d'origine ..."? Je pense que c'est une expérience avec laquelle tout le monde a eu des problèmes une fois. Je m'inquiète actuellement du fait que le chef du groupe ait le devoir de «réfléchir à deux plans pour chaque personne lors de la prochaine pratique».

En regardant les noms de groupes des artistes récents, je sens que le nombre de noms très uniques et complexes augmente. C'est un événement très important de penser au nom du groupe lors de la formation de notre propre groupe original. Dans l'industrie de la musique ces jours-ci, où les noms de groupes se diversifient en raison de l'augmentation du nombre de groupes, beaucoup de gens peuvent avoir du mal à choisir un «bon nom de groupe» avec originalité.

Donc, cette fois, afin de résoudre les problèmes ci-dessus, j'ai commencé le travail de cet article avec l'approche de la génération automatique en utilisant un simple traitement du langage naturel (même si je n'ai pas utilisé beaucoup de technologie de traitement du langage naturel après tout). ).

Le script créé cette fois et la liste des noms de groupes de métal collectés sont ici.

Ce que j'ai fait

Vue d'ensemble (pitch de l'élévateur)

Nom de bande généré

Je l'ai généré automatiquement plusieurs fois et j'ai choisi ceux que j'aimais personnellement.

Bring Funeral Against You
Devil Brings Sacred
Burden Minus Trooper Hollow
Brat Murphy Thrice Hearts
Brides Macabre Tigers Hotel
Project Farewell My Eyes
Glass Cloud Nothings Black
Necropsy Rites Of Today

Tendances des noms de groupes de metal modernes et approches de ceux-ci

Les noms des groupes de metal modernes de nos jours sont devenus très complexes. Ce qui suit est un exemple.

À la suite de ma propre analyse, j'ai senti qu'il y avait une tendance comme suit.

--3-4 chaîne de mots anglais

De plus, en écoutant les histoires des personnes impliquées dans le groupe, j'ai appris que les points suivants devaient être gardés à l'esprit lors du choix du nom du groupe.

--Catchy reste une fois abrégé

Parmi les tendances analysées, j'ai pensé qu'il serait possible de collecter des mots utilisés comme noms de bande et de les générer automatiquement par certains traitements, sauf pour les mots inventés. Dans cet article, nous avons essayé la génération automatique en utilisant les trois approches suivantes.

  1. Spécifiez un mot que vous souhaitez utiliser et le nombre de mots que vous souhaitez générer, puis extrayez de manière aléatoire le nombre de mots restant de la liste de mots.
  2. Spécifiez un acronyme et extrayez au hasard les mots le long de l'acronyme de la liste de mots.
  3. Spécifiez le nombre de mots que vous souhaitez générer et générer à l'aide de la chaîne de Markov

Supplément: À propos de la chaîne de Markov

En gros, qu'est-ce que la chaîne de Markov? "L'état du temps" t + 1 "ne dépend que de l'état du temps courant" t "(pour l'état du temps" ti (i <0) "dans le passé. C'est un processus stochastique avec l'idée (propriété de Markov).

L '"état" dans la génération de phrases correspond aux lettres, mots et phrases. (Mot dans cette génération de nom de groupe)

Par exemple

Si vous utilisez les quatre noms de bande comme échantillon, Après "The", "Rolling" apparaît avec une probabilité de 0,75 (= 3/4), et après "Rolling", avec une probabilité égale de 0,33 (= 1/3), "Stones", "Korokoros", "GoroGoros" "Apparaît. Après "Led", "Zeppelin" apparaît toujours avec une probabilité de 1,00 (= 1/1), Vous pouvez décider de l'état suivant (= mot suivant) comme ceci. En augmentant le nombre d'échantillons, vous pouvez créer un modèle avec plus de variations.

Pour une explication détaillée de la chaîne de Markov et de son implémentation par python, [cet article](https://qiita.com/k-jimon/items/f02f ae75e853a9c02127 pour chaque mode implémenté) est expliqué d'une manière facile à comprendre.

la mise en oeuvre

Environnement de montage

OS: Ubuntu 18.04.2 LTS
Python: 3.6

Collection de noms de bande

Nous avons collecté à partir de la liste des noms de groupes de chaque genre Wikipedia et créé un fichier txt au format 1 ligne 1 bande. Cela a également été téléchargé dans le référentiel github!

Genres collectés cette fois


- Christian hardcore
- deathcore
- djent
- mathcore
- metalcore
- hardcore punk
- heavy metal

Au final, nous avons pu collecter 1 730 bandes.

code

generate.py


import numpy as np
import random
import re
from collections import defaultdict
import pprint

def make_by_word(seed_word, num_word, init_dict):
    """Générer en utilisant le mot spécifié"""
    result_words = [seed_word]
    seed_word = seed_word.lower()
    for i in range(num_word-1):
        chosen_word = random.choice(tokenized_text)
        result_words.append(chosen_word)

    bandname = result_words
    if "the" in bandname or "The" in bandname:
        for i, res in enumerate(result_words):
            if res.lower() == "the":
                bandname[0], bandname[i] = bandname[i], bandname[0]
    else:
        random.shuffle(bandname)

    print(" ".join(bandname))

def make_by_initial_name(seed, init_dict):
    """Généré sur la base des initiales spécifiées"""
    seed = seed.lower()
    result_words = []
    for initial in seed:
        #print(initial)
        #print(init_dict[initial])
        choices = init_dict[initial]
        chosen_word = random.choice(choices)
        result_words.append(chosen_word.capitalize())

    print(" ".join(result_words))

def walk_graph(seed, graph, distance=5, start_node=None):
    """Généré à l'aide de la chaîne de Markov en spécifiant le nombre de mots"""
    if distance <= 0:
        return []
    #print(seed)
    # If not given, pick a start node at random.
    if not start_node:
        start_node = random.choice(list(graph.keys()))


    weights = np.array(
        list(markov_graph[start_node].values()),
        dtype=np.float64)
    # Normalize word counts to sum to 1.
    weights /= weights.sum()

    # Pick a destination using weighted distribution.
    choices = list(markov_graph[start_node].keys())
    #print(choices)

    chosen_word = np.random.choice(choices, None, p=weights)

    result_words = [chosen_word] + walk_graph(seed,
        graph, distance=distance-1,
        start_node=chosen_word)

    return result_words


if __name__ == '__main__':
    # preprocess
    ## Read text from file and tokenize.
    path = './band_list/band_list.txt'

    with open(path) as f:
      text = f.read()
    #print(text)
    tokenized_text = [
        word
        for word in re.split('\W+', text)
        if word != ''
    ]

    init_dict = defaultdict(list)
    for word in set(tokenized_text):
      word_ = word.lower()
      init_dict[word_[0]].append(word_)

    ## Create graph.
    markov_graph = defaultdict(lambda: defaultdict(int))

    last_word = tokenized_text[0].lower()
    for word in tokenized_text[1:]:
        word = word.lower()
        markov_graph[last_word][word] += 1
        last_word = word


    # main process
    print("""\
    mode:
    1: generate the words you want to use and the num of words you set(e.g. bring 4)
    2: set the acronym you want to use(e.g. BMTH)
    3: set hte word count and generate a Markov chain model(e.g. 4)""")
    mode = int(input("mode? >> "))

    if mode == 1:
        seed = input("seed? >> ")
        num_word = int(input("word num? >> "))
        print("--------------------------")
        for i in range(10):
            make_by_word(seed, num_word, init_dict)

    elif mode == 2:
        seed = input("initial? >> ")
        print("--------------------------")
        for i in range(10):
            make_by_initial_name(seed, init_dict)

    else:
        seed = int(input("word num? >> "))
        print("--------------------------")
        for i in range(10):
            #print(' '.join(walk_graph(
            #      markov_graph, distance=len(seed))), '\n')
            count = 0
            res = walk_graph(seed, markov_graph, distance=seed)
            print(" ".join(res))

Comme prétraitement ・ Lisez la liste des noms de groupes ・ Stockez le nom du groupe dans le dictionnaire ・ Créer un graphe de Markov Après l'exécution, la génération du nom de bande, qui est la fonction principale, est effectuée.

Cette fois, je l'ai implémenté avec les trois approches mentionnées ci-dessus.

  1. Spécifiez un mot que vous souhaitez utiliser et le nombre de mots que vous souhaitez générer, puis extrayez au hasard le nombre de mots restant de la liste de mots (make_by_word ())
  2. Spécifiez un acronyme et extrayez au hasard les mots le long de l'acronyme de la liste de mots (make_by_initial_name ())
  3. Spécifiez le nombre de mots que vous souhaitez générer et générer à l'aide de la chaîne de Markov (walk_graph ())

En fait, générer un nom de bande

Procédez comme suit:

python generate.py

Ce qui suit est sorti, alors sélectionnez le mode.

mode:
1: generate the words you want to use and the num of words you set(e.g. bring 4)
2: set the acronym you want to use(e.g. BMTH)
3: set hte word count and generate a Markov chain model(e.g. 4)
mode? >>

Le contour de chaque mode est le suivant.

1:La génération du nom de bande est effectuée en spécifiant le mot que vous souhaitez utiliser et le nombre de mots que vous souhaitez générer.(Exemple: apporter 4)
2:Spécifiez la première lettre du nom de bande que vous souhaitez générer et générez le nom de bande.(Exemple: BMTH)
3:Spécifiez le nombre de mots que vous souhaitez générer et générez le nom de bande à l'aide du modèle de chaîne de Markov.

10 noms de bande sont automatiquement générés en définissant la valeur à demander pour chaque mode.

Mode 1: spécifiez le mot que vous souhaitez utiliser et le nombre de mots

Utilisez ce mode si vous avez un mot que vous souhaitez utiliser. Vous pouvez spécifier un mot qui n'existe pas. (Le nom de bande généré sous la partie soulignée de la sortie standard.)

mode:
1: generate the words you want to use and the num of words you set(e.g. bring 4)
2: set the acronym you want to use(e.g. BMTH)
3: set hte word count and generate a Markov chain model(e.g. 4)
mode? >> 1
seed? >> Bring
word num? >> 4
--------------------------
Bring Funeral Against You
Bring Deftones Airlines Kids
Hesitation Dire Bring Psyopus
Lions Barren Bring Dismemberment
Rorschach Bring Hand Bloodshed
Bring Pereo Hound This
Take Remains Bring Skycamefalling
Bring Sick Bunchofuckingoofs Annisokay
Rock Bring Fall Drivers
Devil Bring s Sacred

Mode 2: spécifiez la première lettre du nom de bande que vous souhaitez générer

De nos jours, les noms de groupes sont souvent abrégés par des initiales, c'est donc le mode que nous avons implémenté. (Le nom de bande généré sous la partie soulignée de la sortie standard.)

mode:
1: generate the words you want to use and the num of words you set(e.g. bring 4)
2: set the acronym you want to use(e.g. BMTH)
3: set hte word count and generate a Markov chain model(e.g. 4)
mode? >> 2
initial? >> BMTH
--------------------------
Bullet Minutemen Thee Hoax
Burst Meat Treason Hand
Burden Minus Trooper Hollow
Blitzkrieg Mantis Treatment Horse
Botch Me Troy Hat
Beasts Mad Tattoo Hacktivist
Break Moxy They Headpins
Brat Murphy Thrice Hearts
Blue Mountain They Houses
Brides Macabre Tigers Hotel

Vous pouvez décider de haut en bas en raison de la fraîcheur lorsqu'il est abrégé.

Mode 3: spécifiez uniquement le nombre de mots que vous souhaitez générer et générer avec le modèle de chaîne de Markov

Générez à l'aide du modèle de chaîne de Markov en spécifiant uniquement le nombre de mots. (Le nom de bande généré sous la partie soulignée de la sortie standard.)

mode:
1: generate the words you want to use and the num of words you set(e.g. bring 4)
2: set the acronym you want to use(e.g. BMTH)
3: set hte word count and generate a Markov chain model(e.g. 4)
mode? >> 3
word num? >> 4
--------------------------
venomous concept messiah prophet
wept rapeman pagan altar
hat band opprobrium p
x cries hannah head
lvl maroon alexisonfire mallory
for mine anti cimex
ambassadors of slumber kerber
project farewell my eyes
glass cloud nothings black
necropsy rites of today

Puisqu'il n'y a aucune spécification autre que le nombre de mots, vous pouvez l'utiliser lorsque vous n'avez pas décidé quel mot vous voulez utiliser. Grâce à l'utilisation de la chaîne de Markov, la séquence de mots devrait cette fois être celle des trois modes.

en conclusion

Cette fois, j'ai créé un outil qui génère automatiquement un nom de groupe comme celui-ci basé sur les mots utilisés dans le nom de groupe existant. Je vais essayer quelques fois et suggérer ce que j'aime pour le nom du groupe. La demande peut être très faible, mais si vous rencontrez des défis similaires, profitez-en.

(Discussion ultérieure)
Le nom du groupe généré automatiquement a été rejeté, mais nous avons pu rafraîchir les idées que les autres membres avaient proposées et décider en toute sécurité!

référence

Recommended Posts

Je veux générer automatiquement un nom de groupe de metal moderne
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je souhaite envoyer automatiquement un e-mail de création d'entreprise
Je veux imprimer dans la notation d'inclusion
Je veux créer un environnement Python
Je veux faire de matplotlib un thème sombre
Je veux INSÉRER un DataFrame dans MSSQL
Je veux créer une fenêtre avec Python
Je veux faire un jeu avec Python
Je ne veux pas passer un test de codage
Je souhaite créer un type d'implémentation pouvant être branché
J'ai essayé de générer une chaîne de caractères aléatoire
Je veux trouver facilement une délicieuse boutique
Je veux écrire dans un fichier avec Python
Je souhaite télécharger une application Django sur heroku
J'ai essayé de générer automatiquement une table de gestion des ports à partir de L2SW Config
Je veux voir le nom de fichier de DataLoader
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux répéter plusieurs fois un générateur Python
Je veux que DQN Puniki frappe un home run
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
Je veux donner un group_id à une trame de données pandas
Je veux faire la transition avec un bouton sur le ballon
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux écrire en Python! (2) Écrivons un test
Je veux trouver un package populaire sur PyPi
Je veux échantillonner au hasard un fichier avec Python
Je souhaite créer facilement un environnement de développement basé sur un modèle
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je souhaite installer un package de Php Redis
[Python] Je veux faire d'une liste imbriquée un taple
Je souhaite créer manuellement une légende avec matplotlib
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux faire Wake On LAN de manière entièrement automatique
Je veux lier une variable locale avec lambda
J'ai essayé de générer automatiquement la chaîne de caractères à entrer dans M. Adjustment avec Python
Je veux un générateur de mox
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
Je veux démarrer beaucoup de processus à partir de python
Je veux faire une macro de clic avec pyautogui (désir)
J'ai fait une commande pour générer un commentaire pour une table dans Django
Je veux résoudre SUDOKU
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Je veux faire une macro de clic avec pyautogui (Outlook)
Je veux un générateur mox (2)
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
[Django] Je souhaite me connecter automatiquement après une nouvelle inscription
J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE
[Introduction à Pytorch] Je souhaite générer des phrases dans des articles de presse
[Visualisation] Je veux dessiner un beau graphique avec Plotly
Je veux ajouter un joli complément à input () en python