文字列処理を使用するだけの方法がありますが、それらを解析してnewick形式で再帰的に出力します。若干最小限の実装:
import re
class Tree(object):
def __init__(self, label):
self.label = label
self.children = []
@staticmethod
def _tokenize(string):
return list(reversed(re.findall(r'\(|\)|[^ \n\t()]+', string)))
@classmethod
def from_string(cls, string):
tokens = cls._tokenize(string)
return cls._tree(tokens)
@classmethod
def _tree(cls, tokens):
t = tokens.pop()
if t == '(':
tree = cls(tokens.pop())
for subtree in cls._trees(tokens):
tree.children.append(subtree)
return tree
else:
return cls(t)
@classmethod
def _trees(cls, tokens):
while True:
if not tokens:
raise StopIteration
if tokens[-1] == ')':
tokens.pop()
raise StopIteration
yield cls._tree(tokens)
def to_newick(self):
if self.children and len(self.children) == 1:
return ','.join(child.to_newick() for child in self.children)
elif self.chilren:
return '(' + ','.join(child.to_newick() for child in self.children) + ')'
else:
return self.label
もちろん、端末ノードだけが保持されるため、情報は変換中に失われます。使用法:
>>> s = """(ROOT (..."""
>>> Tree.from_string(s).to_newick()
...
は=どうもありがとうございます) –
私は(https://github.com/L3viathan/toolib/blob/master/nlp.py)私の[様々なNLPの機能のファイル]から、ほぼ逐語的にそれをコピーします(あなたが構文解析木で作業している場合には便利かもしれません)、 'to_newick'を追加するだけです。 – L3viathan
申し訳ありませんが、私はあなたを理解していませんでした!私はあなたのコードをコピーしましたが動作しません:( –