[PYTHON] Da es Weihnachten ist, werde ich versuchen, die Genealogie Jesu Christi mit Cabocha zu zeichnen

Da es Weihnachten ist, werde ich es in die Genealogie von Jesus Christus im Evangelium von Matai zeichnen.

Abrahams Sohn ist Isaku,
Isakus Sohn ist Jacob,
Jakobs Sohn ist Juda und seine Brüder.
Der Sohn Judas ist Perez von Tamar und Zera.
Der Sohn von Perez ist Hezlon,
Hezlons Sohn ist Ram,
Lamms Sohn ist Aminadab,
Aminadabs Kind ist Nachon,
Nachons Kind ist Lachs,
Lachs Sohn ist Boas von Lahab,
Boaz 'Sohn ist Ruths Obede,
Obedes Sohn ist Essai,
Der Sohn von Essai ist David.

Davids Sohn ist Solomon von Uriahs Frau.
Salomos Sohn ist Rehabaam,
Der Sohn von Rehabaam ist Abiya,
Abiyas Sohn ist Asa,
Asas Kind ist Yoshapate,
Der Sohn von Yoshapate ist Yoram,
Der Sohn von Yoram ist Ujiya,
Ujiyas Sohn ist Yotam,
Yotams Kind ist Ahas,
Ahas 'Kind ist Hizekiya,
Hizekiyas Kind ist Manase,
Manases Sohn ist Amon,
Amons Sohn ist Yoshiya,
Die Söhne Josias waren Econia und ihre Brüder zur Zeit der Vertreibung Babylons.

Nach der Vertreibung Babylons:
Econias Kind ist Charter,
Charters Sohn ist Zelbabel,
Zelbabels Sohn ist Abiude,
Abiudes Sohn ist Eliya Kim,
Eliya Kims Sohn ist Azor,
Azors Kind ist Sadoku,
Sadokus Kind ist Akim,
Akims Sohn ist Eriude,
Eliudes Sohn ist Eleazar,
Der Sohn von Eleasar ist Matane,
Matanes Sohn ist Jacob,
Jakobs Sohn ist Marys Ehemann Joseph.

Vorbereitung

Installation von Cabocha 0.68 http://qiita.com/mima_ita/items/161cd869648edb30627b

Installation von GraphViz und pydot http://needtec.exblog.jp/20608517/

Erstellen Sie ein Benutzerwörterbuch

Da es einen eindeutigen Namen gibt, erstellen Sie ein Benutzerwörterbuch, damit eine morphologische Analyse durchgeführt werden kann. Erstellen Sie die folgende CSV.

bible.csv


Abraham,0,0,500,Substantiv,Allgemeines,*,*,*,*,Abraham,Abraham,Abraham
Isaku,0,0,500,Substantiv,Allgemeines,*,*,*,*,Isaku,Isaku,Isaku
Jakob,0,0,500,Substantiv,Allgemeines,*,*,*,*,Jakob,Jakob,Jakob
Juda,0,0,500,Substantiv,Allgemeines,*,*,*,*,Juda,Juda,Juda
Zera,0,0,500,Substantiv,Allgemeines,*,*,*,*,Zera,Zera,Zera
Perez,0,0,500,Substantiv,Allgemeines,*,*,*,*,Perez,Perez,Perez
Hezlon,0,0,500,Substantiv,Allgemeines,*,*,*,*,Hezlon,Hezlon,Hezlon
Lamm,0,0,500,Substantiv,Allgemeines,*,*,*,*,Lamm,Lamm,Lamm
Amina Dub,0,0,500,Substantiv,Allgemeines,*,*,*,*,Amina Dub,Amina Dub,Amina Dub
Nation,0,0,500,Substantiv,Allgemeines,*,*,*,*,Nation,Nation,Nation
Lachs,0,0,500,Substantiv,Allgemeines,*,*,*,*,Lachs,Lachs,Lachs
Boas,0,0,500,Substantiv,Allgemeines,*,*,*,*,Boas,Boas,Boas
Obede,0,0,500,Substantiv,Allgemeines,*,*,*,*,Obede,Obede,Obede
Essai,0,0,500,Substantiv,Allgemeines,*,*,*,*,Essai,Essai,Essai
David,0,0,500,Substantiv,Allgemeines,*,*,*,*,David,David,David
Solomon,0,0,500,Substantiv,Allgemeines,*,*,*,*,Solomon,Solomon,Solomon
Reha Baam,0,0,500,Substantiv,Allgemeines,*,*,*,*,Reha Baam,Reha Baam,Reha Baam
Abiya,0,0,500,Substantiv,Allgemeines,*,*,*,*,Abiya,Abiya,Abiya
Als ein,0,0,500,Substantiv,Allgemeines,*,*,*,*,Als ein,Als ein,Als ein
Yosha Kitt,0,0,500,Substantiv,Allgemeines,*,*,*,*,Yosha Kitt,Yosha Kitt,Yosha Kitt
Yoram,0,0,500,Substantiv,Allgemeines,*,*,*,*,Yoram,Yoram,Yoram
Ujiya,0,0,500,Substantiv,Allgemeines,*,*,*,*,Ujiya,Ujiya,Ujiya
Yotam,0,0,500,Substantiv,Allgemeines,*,*,*,*,Yotam,Yotam,Yotam
Ahas,0,0,500,Substantiv,Allgemeines,*,*,*,*,Ahas,Ahas,Ahas
Hizekiya,0,0,500,Substantiv,Allgemeines,*,*,*,*,Hizekiya,Hizekiya,Hizekiya
Manase,0,0,500,Substantiv,Allgemeines,*,*,*,*,Manase,Manase,Manase
Amon,0,0,500,Substantiv,Allgemeines,*,*,*,*,Amon,Amon,Amon
Yoshiya,0,0,500,Substantiv,Allgemeines,*,*,*,*,Yoshiya,Yoshiya,Yoshiya
Babylon,0,0,500,Substantiv,Allgemeines,*,*,*,*,Babylon,Babylon,Babylon
Econia,0,0,500,Substantiv,Allgemeines,*,*,*,*,Econia,Econia,Econia
Charta,0,0,500,Substantiv,Allgemeines,*,*,*,*,Charta,Charta,Charta
Zelbabel,0,0,500,Substantiv,Allgemeines,*,*,*,*,Zelbabel,Zelbabel,Zelbabel
Abiude,0,0,500,Substantiv,Allgemeines,*,*,*,*,Abiude,Abiude,Abiude
Eliya Kim,0,0,500,Substantiv,Allgemeines,*,*,*,*,Eliya Kim,Eliya Kim,Eliya Kim
Azor,0,0,500,Substantiv,Allgemeines,*,*,*,*,Azor,Azor,Azor
Sadoku,0,0,500,Substantiv,Allgemeines,*,*,*,*,Sadoku,Sadoku,Sadoku
Akim,0,0,500,Substantiv,Allgemeines,*,*,*,*,Akim,Akim,Akim
Eriude,0,0,500,Substantiv,Allgemeines,*,*,*,*,Eriude,Eriude,Eriude
Elea Affe,0,0,500,Substantiv,Allgemeines,*,*,*,*,Elea Affe,Elea Affe,Elea Affe
Matane,0,0,500,Substantiv,Allgemeines,*,*,*,*,Matane,Matane,Matane
Jakob,0,0,500,Substantiv,Allgemeines,*,*,*,*,Jakob,Jakob,Jakob

In Windows können Sie ein Benutzerwörterbuch mit dem Namen bible.dic erstellen, indem Sie den folgenden Befehl an der Eingabeaufforderung ausführen.

"C:\Program Files (x86)\MeCab\bin\mecab-dict-index" -d"C:\Program Files (x86)\MeCab\dic\ipadic" -u bible.dic -f shift-jis -t utf-8 bible.csv

In Cabocha können Sie eine Abhängigkeitsanalyse mithilfe des Benutzerwörterbuchs durchführen, indem Sie den Pfad des Benutzerwörterbuchs mit der Option -u angeben.

Code zum Erstellen eines Familiendiagramms

bible.py


#!/usr/bin/python
# -*- coding: utf-8 -*-
import CaboCha
import pydot
import uuid
import sys


class node:
    """
Stammbaumknoten aufzeichnen
    """
    def __init__(self):
        self.name = None
        self.children_node = {}
        self.pairs_node = {}
        self.id = str(uuid.uuid4())

font_name = "ms ui gothic"

sentence = """
Abrahams Sohn ist Isaku,\n
Isakus Sohn ist Jacob,\n
Jakobs Sohn ist Juda und seine Brüder.\n
Der Sohn Judas ist Perez von Tamar und Zera.\n
Der Sohn von Perez ist Hezlon,\n
Hezlons Sohn ist Ram,\n
Lamms Sohn ist Aminadab,\n
Aminadabs Kind ist Nachon,\n
Nachons Kind ist Lachs,\n
Lachs Sohn ist Boas von Lahab,\n
Boaz 'Sohn ist Ruths Obede,\n
Obedes Sohn ist Essai,\n
Der Sohn von Essai ist David.\n

Davids Sohn ist Solomon von Uriahs Frau.\n
Salomos Sohn ist Rehabaam,\n
Der Sohn von Rehabaam ist Abiya,\n
Abiyas Sohn ist Asa,\n
Asas Kind ist Yoshapate,\n
Der Sohn von Yoshapate ist Yoram,\n
Der Sohn von Yoram ist Ujiya,\n
Ujiyas Sohn ist Yotam,\n
Yotams Kind ist Ahas,\n
Ahas 'Kind ist Hizekiya,\n
Hizekiyas Kind ist Manase,\n
Manases Sohn ist Amon,\n
Amons Sohn ist Yoshiya,\n
Die Söhne Josias waren Econia und ihre Brüder zur Zeit der Vertreibung Babylons.\n

Nach der Vertreibung Babylons:\n
Econias Kind ist Charter,\n
Charters Sohn ist Zelbabel,\n
Zelbabels Sohn ist Abiude,\n
Abiudes Sohn ist Eliya Kim,\n
Eliya Kims Sohn ist Azor,\n
Azors Kind ist Sadoku,\n
Sadokus Kind ist Akim,\n
Akims Sohn ist Eriude,\n
Eliudes Sohn ist Eleazar,\n
Der Sohn von Eleasar ist Matane,\n
Matanes Sohn ist Jacob,\n
Jakobs Sohn ist Marys Ehemann Joseph.\n
"""


def get_word(tree, ix):
    surface = tree.token(ix).surface
    f = tree.token(ix).feature.split(",")
    return surface, f


def create_node(tree, chunk):
    s1, f1 = get_word(tree, chunk.token_pos + chunk.head_pos)
    s2 = None
    f2 = None
    type = 0
    if chunk.head_pos != chunk.func_pos:
        s2, f2 = get_word(tree, chunk.token_pos + chunk.func_pos)
        if f2[0] == 'Partikel':
            if f2[1] == 'Union':  #"von"
                type = 1
            elif f2[1] == 'Hilfe':  #"Ha"
                type = 2
            elif f2[1] == 'Verbindungsassistent':  #"Wann"
                type = 3
            elif f2[1] == 'Fallassistent':  #"durch"
                type = 4
    if f1[0] == 'Substantiv':
        if f1[1] == 'Suffix':
            s1 = tree.token(chunk.token_pos + chunk.head_pos - 1).surface + s1
    return {
        'text': s1,
        'type': type
    }


def find_child(t, child_name):
    """
Ruft einen Knoten mit einem bestimmten untergeordneten Element aus dem Stammbaum ab
    """
    for key, item in t.children_node.items():
        if key == child_name and item is None:
            return t
        elif item is not None:
            ret = find_child(item, child_name)
            if ret:
                return ret
    return None


def dump_family(family_tree):
    """
Familiendiagramm Dump
    """
    print ('Elternteil:', family_tree.name)
    for key, item in family_tree.pairs_node.items():
        print ('Ehefrau:', key)

    for key, item in family_tree.children_node.items():
        print ('Kind:', key)
        if item:
            print (dump_family(item))


def create_graph_children(graph, p_node, child):
    n = pydot.Node(child.id,
                   label=child.name,
                   style="filled",
                   fillcolor="green",
                   shape = "box",
                   fontname=font_name)
    subg = pydot.Subgraph('', rank='same')
    subg.add_node(n)
    graph.add_subgraph(subg)
    if p_node:
        graph.add_edge(pydot.Edge(p_node, n))

    for key, item in child.pairs_node.items():
        pair = pydot.Node(str(uuid.uuid4()),
                          label=key,
                          style="filled",
                          fillcolor="pink",
                          shape = "box",
                          fontname=font_name)
        subg.add_node(pair)
        graph.add_edge(pydot.Edge(n, pair))

    for key, item in child.children_node.items():
        if item:
            create_graph_children(graph, n, item)
        else:
            nchild = pydot.Node(str(uuid.uuid4()),
                                label=key,
                                style="filled",
                                fillcolor="gray",
                                shape = "box",
                                fontname=font_name)
            graph.add_node(nchild)
            graph.add_edge(pydot.Edge(n, nchild))


def create_graph(family_tree):
    graph = pydot.Dot(graph_type='digraph',
                      fontname=font_name)
    create_graph_children(graph, None, family_tree)
    graph.write_png('example2_graph.png')


def main(argvs, argc):
    c = CaboCha.Parser("-u bible.dic")
    lines = sentence.split("\n")
    family_tree = None
    for line in lines:
        tree = c.parse(line)
        data = node()
        if tree.chunk_size() == 0:
            continue
        ids = {-1: None}
        children = []
        pairs = []
        for i in range(tree.chunk_size()):
            curid = i
            if i in ids:
                continue
            chunk = tree.chunk(i)
            attr = None
            cnn_type = 0
            while True:
                d = create_node(tree, chunk)
                ids[curid] = d
                if data.name is None:
                    data.name = d['text']
                if cnn_type == 1:  #Der vorherige Block endet mit "Nein".
                    if d['text'] == 'Kind':
                        attr = 'children'
                elif cnn_type == 2:  #Der vorherige Block endet mit "ha"
                    if attr == 'children':
                        children.append(curid)
                elif cnn_type == 3:  #Gleiche Operation, wenn der vorherige Block mit "und" endet.
                    if attr == 'children':
                        children.append(curid)
                else:
                    attr = None
                if d['type'] == 4:  #Wenn der Block mit "by" endet, wird er als Ehepartner betrachtet
                    pairs.append(i)
                else:
                    cnn_type = d['type']
                if not chunk.link in ids:
                    curid = chunk.link
                    chunk = tree.chunk(curid)
                else:
                    break
        for child in children:
            data.children_node[ids[child]['text']] = None

        for pair in pairs:
            data.pairs_node[ids[pair]['text']] = None

        if len(children) > 0:
            if family_tree is None:
                family_tree = data
            else:
                node_obj = find_child(family_tree, data.name)
                if node_obj:
                    node_obj.children_node[data.name] = data
    if family_tree:
        dump_family(family_tree)
        create_graph(family_tree)


if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)
    sys.exit(main(argvs, argc))

Dadurch wird ein Stammbaum erstellt, der dem folgenden ähnelt: example2_graph.png

Wenn Sie in einem ähnlichen Stil schreiben, können Sie wahrscheinlich verschiedene Familiendiagramme erstellen.

Derzeit ermöglicht die Datenstruktur, mit der Sie mehrere Ehepartner festlegen können, Ihren Vorfahren, auf intensive Paarungsaktivitäten zu reagieren, aber mir ist nicht bekannt, wer und wer Kinder sind. ..

Recommended Posts

Da es Weihnachten ist, werde ich versuchen, die Genealogie Jesu Christi mit Cabocha zu zeichnen
Es ist Halloween, also werde ich versuchen, es mit Python zu verstecken
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Versuchen Sie, nur den Kohlenstoff am Ende der Kette mit SMARTS zu reagieren
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
[Überprüfung] Versuchen Sie, die Punktgruppe an der Optimierungsfunktion von Pytorch Part 1 auszurichten
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Versuchen Sie, die Bewegung des Sonnensystems zu simulieren
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
[Neo4J] ④ Versuchen Sie, die Diagrammstruktur mit Cypher zu handhaben
Es ist mühsam, "Kodierung: utf-8" in Python zu schreiben, also werde ich etwas mit Shellscript machen
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Versuchen Sie, die Nährstoffe von Cornflakes zu visualisieren, die M-1-Champion Milkboy mit Python sagte