[PYTHON] Ich möchte automatisch einen modernen Metal-Bandnamen generieren

Einführung

Hast du jemals die Erfahrung gemacht "Ich kann mich nicht für den Namen unserer ursprünglichen Band entscheiden ..."? Ich denke, es ist eine Erfahrung, mit der jeder einmal Probleme hatte. Ich mache mir derzeit Sorgen, dass der Bandleader die Hausaufgabe erhält, "beim nächsten Training über zwei Pläne für jede Person nachzudenken".

Wenn ich mir die Bandnamen der jüngsten Künstler anschaue, habe ich das Gefühl, dass die Anzahl sehr einzigartiger und komplexer Namen zunimmt. Es ist ein sehr wichtiges Ereignis, bei der Gründung unserer eigenen Originalband über den Bandnamen nachzudenken. In der heutigen Musikindustrie, in der sich die Bandnamen aufgrund der zunehmenden Anzahl von Bands diversifizieren, fällt es vielen Menschen möglicherweise schwer, sich für einen "guten Bandnamen" mit Originalität zu entscheiden.

Um die oben genannten Probleme zu lösen, begann ich dieses Mal mit der Arbeit dieses Artikels mit dem Ansatz, automatisch mithilfe einer einfachen Verarbeitung natürlicher Sprache zu generieren (obwohl ich schließlich nicht viel Technologie zur Verarbeitung natürlicher Sprache verwendet habe). ).

Das diesmal erstellte Skript und die Liste der gesammelten Metal-Bandnamen sind hier.

Was ich gemacht habe

Übersicht (Fahrstuhlabstand)

Generierter Bandname

Ich habe es mehrmals automatisch generiert und diejenigen ausgewählt, die mir persönlich gefallen haben.

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

Trends in modernen Metal-Bandnamen und Herangehensweisen an sie

Die Namen moderner Metalbands sind heutzutage sehr komplex geworden. Das Folgende ist ein Beispiel.

Als Ergebnis meiner eigenen Analyse hatte ich das Gefühl, dass eine Tendenz wie folgt besteht.

--3-4 englische Wortfolge

Als ich mir die Geschichten der Leute anhörte, die an der Band beteiligt waren, bekam ich die Information, dass die folgenden Punkte bei der Entscheidung über den Bandnamen beachtet werden sollten.

Unter den Trends, die ich analysierte, dachte ich, dass es möglich sein würde, Wörter, die als Bandnamen verwendet werden, zu sammeln und sie durch eine bestimmte Verarbeitung automatisch zu generieren, mit Ausnahme von geprägten Wörtern. In diesem Artikel haben wir die automatische Generierung mit den folgenden drei Ansätzen versucht.

  1. Geben Sie ein Wort an, das Sie verwenden möchten, und die Anzahl der Wörter, die Sie generieren möchten, und extrahieren Sie die verbleibende Anzahl von Wörtern zufällig aus der Wortliste.
  2. Geben Sie ein Akronym an und extrahieren Sie zufällig Wörter entlang des Akronyms aus der Wortliste.
  3. Geben Sie die Anzahl der Wörter an, die Sie mithilfe der Markov-Kette generieren und generieren möchten

Ergänzung: Über die Markov-Kette

Grob gesagt, was ist die Markov-Kette? "Der Zustand der Zeit" t + 1 "hängt nur vom Zustand der aktuellen Zeit" t "ab (für den Zustand der Zeit" ti (i <0) "in der Vergangenheit. Es ist ein stochastischer Prozess mit der Idee (Markov-Eigenschaft).

Der "Zustand" bei der Satzgenerierung entspricht Buchstaben, Wörtern und Phrasen. (Wort in dieser Bandnamengeneration)

Zum Beispiel

Wenn Sie die vier Bandnamen als Beispiel verwenden, Nach "The" erscheint "Rolling" mit einer Wahrscheinlichkeit von 0,75 (= 3/4) und nach "Rolling" mit einer gleichen Wahrscheinlichkeit von 0,33 (= 1/3) "Stones", "Korokoros", "GoroGoros". "Erscheint. Nach "Led" erscheint "Zeppelin" immer mit einer Wahrscheinlichkeit von 1,00 (= 1/1), Sie können den nächsten Zustand (= nächstes Wort) wie folgt festlegen. Durch Erhöhen der Anzahl der Stichproben können Sie ein Modell mit mehr Variationen erstellen.

Eine ausführliche Erläuterung der Markov-Kette und ihrer Implementierung durch Python finden Sie in [diesem Artikel] auf leicht verständliche Weise (https://qiita.com/k-jimon/items/f02f ae75e853a9c02127 für jeden implementierten Modus).

Implementierung

Montageumgebung

OS: Ubuntu 18.04.2 LTS
Python: 3.6

Bandnamensammlung

Wir haben aus der Bandnamenliste jedes Wikipedia-Genres eine txt-Datei im 1-Zeilen-1-Bandformat erstellt. Dies wurde auch in das Github-Repository hochgeladen!

Diesmal gesammelte Genres


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

Am Ende konnten wir 1.730 Bands sammeln.

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):
    """Generieren Sie mit dem angegebenen Wort"""
    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):
    """Generiert basierend auf den angegebenen Initialen"""
    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):
    """Wird mithilfe der Markov-Kette durch Angabe der Anzahl der Wörter generiert"""
    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))

Als Vorbehandlung ・ Lesen Sie die Bandnamenliste ・ Speichern Sie den Bandnamen im Wörterbuch ・ Markov-Diagramm erstellen Nach dem Durchführen wird die Generierung des Bandnamens durchgeführt, die die Hauptfunktion darstellt.

Dieses Mal habe ich es mit den drei oben genannten Ansätzen implementiert.

  1. Geben Sie ein Wort an, das Sie verwenden möchten, und die Anzahl der Wörter, die Sie generieren möchten, und extrahieren Sie die verbleibende Anzahl von Wörtern zufällig aus der Wortliste (make_by_word ()).
  2. Geben Sie ein Akronym an und extrahieren Sie zufällig Wörter entlang des Akronyms aus der Wortliste (make_by_initial_name ()).
  3. Geben Sie die Anzahl der Wörter an, die Sie mithilfe der Markov-Kette generieren und generieren möchten (walk_graph ()).

Erzeugen Sie tatsächlich einen Bandnamen

Mach Folgendes:

python generate.py

Folgendes wird ausgegeben, wählen Sie also den Modus.

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

Der Umriss jedes Modus ist wie folgt.

1:Die Generierung des Bandnamens erfolgt durch Angabe des zu verwendenden Wortes und der Anzahl der zu generierenden Wörter.(Beispiel: 4 mitbringen)
2:Geben Sie den ersten Buchstaben des Bandnamens an, den Sie generieren möchten, und generieren Sie den Bandnamen.(Beispiel: BMTH)
3:Geben Sie die Anzahl der Wörter an, die Sie generieren möchten, und generieren Sie den Bandnamen mithilfe des Markov-Kettenmodells.

10 Bandnamen werden automatisch generiert, indem der Wert festgelegt wird, der für jeden Modus abgefragt werden soll.

Modus 1: Geben Sie das gewünschte Wort und die Anzahl der Wörter an

Verwenden Sie diesen Modus, wenn Sie ein Wort haben, das Sie verwenden möchten. Sie können ein Wort angeben, das nicht vorhanden ist. (Der Bandname, der unter dem unterstrichenen Teil der Standardausgabe generiert wird.)

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

Modus 2: Geben Sie den ersten Buchstaben des Bandnamens an, den Sie generieren möchten

Heutzutage werden Bandnamen oft mit Initialen abgekürzt, daher haben wir diesen Modus implementiert. (Der Bandname, der unter dem unterstrichenen Teil der Standardausgabe generiert wird.)

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

Sie können aufgrund der Kühle von oben nach unten entscheiden, wenn sie abgekürzt werden.

Modus 3: Geben Sie nur die Anzahl der Wörter an, die Sie mit dem Markov-Kettenmodell generieren und generieren möchten

Generieren Sie mit dem Markov-Kettenmodell, indem Sie nur die Anzahl der Wörter angeben. (Der Bandname, der unter dem unterstrichenen Teil der Standardausgabe generiert wird.)

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

Da es keine andere Spezifikation als die Anzahl der Wörter gibt, können Sie sie verwenden, wenn Sie nicht entschieden haben, welches Wort Sie verwenden möchten. Dank der Verwendung der Markov-Kette sollte die Wortfolge diesmal der der drei Modi am ähnlichsten sein.

abschließend

Dieses Mal habe ich ein Tool erstellt, das automatisch einen solchen Bandnamen basierend auf den im vorhandenen Bandnamen verwendeten Wörtern generiert. Ich werde es ein paar Mal versuchen und vorschlagen, was ich für den Bandnamen mag. Die Nachfrage mag sehr gering sein, aber wenn Sie auf ähnliche Herausforderungen stoßen, nutzen Sie diese.

(Späteres Gespräch)
Der automatisch generierte Bandname wurde abgelehnt, aber wir konnten die Ideen der anderen Mitglieder auffrischen und sicher entscheiden!

Referenz

Recommended Posts

Ich möchte automatisch einen modernen Metal-Bandnamen generieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte automatisch eine Unternehmensgründungs-E-Mail senden
Ich möchte in der Einschlussnotation drucken
Ich möchte eine Python-Umgebung erstellen
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte einen DataFrame in MSSQL einfügen
Ich möchte mit Python ein Fenster erstellen
Ich möchte ein Spiel mit Python machen
Ich möchte keinen Codierungstest machen
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich habe versucht, eine zufällige Zeichenfolge zu generieren
Ich möchte leicht einen leckeren Laden finden
Ich möchte mit Python in eine Datei schreiben
Ich möchte eine Django-App auf Heroku hochladen
Ich habe versucht, automatisch eine Portverwaltungstabelle aus L2SW Config zu generieren
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte, dass DQN Puniki einen Homerun macht
100 Klopfen bei der Bildverarbeitung !! (021-030) Ich möchte eine Pause machen ...
Ich möchte einem Pandas-Datenrahmen eine group_id geben
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich möchte ein beliebtes Paket auf PyPi finden
Ich möchte eine Datei mit Python zufällig testen
Ich möchte einfach eine modellbasierte Entwicklungsumgebung erstellen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte ein Paket von Php Redis installieren
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte Wake On LAN vollautomatisch ausführen
Ich möchte eine lokale Variable mit Lambda binden
Ich habe versucht, automatisch die Zeichenfolge zu generieren, die mit Python in Mr. Adjustment eingegeben werden soll
Ich möchte einen Mox-Generator
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
Ich möchte viele Prozesse von Python aus starten
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich möchte SUDOKU lösen
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich möchte einen Mox-Generator (2)
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden
[Django] Ich möchte mich nach einer neuen Registrierung automatisch anmelden
Ich habe ein Tool erstellt, um automatisch ein einfaches ER-Diagramm aus der Anweisung CREATE TABLE zu generieren
[Einführung in Pytorch] Ich möchte Sätze in Nachrichtenartikeln generieren
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen