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.
Installation von Cabocha 0.68 http://qiita.com/mima_ita/items/161cd869648edb30627b
Installation von GraphViz und pydot http://needtec.exblog.jp/20608517/
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.
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:
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. ..