2016-09-25 15 views

答えて

0

文字列処理を使用するだけの方法がありますが、それらを解析して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() 
... 
+0

は=どうもありがとうございます) –

+0

私は(https://github.com/L3viathan/toolib/blob/master/nlp.py)私の[様々なNLPの機能のファイル]から、ほぼ逐語的にそれをコピーします(あなたが構文解析木で作業している場合には便利かもしれません)、 'to_newick'を追加するだけです。 – L3viathan

+0

申し訳ありませんが、私はあなたを理解していませんでした!私はあなたのコードをコピーしましたが動作しません:( –

関連する問題