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.
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
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.
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.
OS: Ubuntu 18.04.2 LTS
Python: 3.6
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.
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.
make_by_word ()
)make_by_initial_name ()
)walk_graph ()
)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.
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
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é.
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.
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é!
Recommended Posts