5

単語のリストがあります。例えば:

reel
road
root
curd

次の構造を反映した方法でこのデータを保存したいと思います。

Start -> r -> e -> reel
           -> o -> a -> road
                   o -> root
         c -> curd

ツリーを実装する必要があることは明らかです。このツリーから、ノードの高さ、ノードの子孫の数、ノードの検索などの統計を簡単に取得できる必要があります。ノードを追加すると、この位置が一意であるため、ツリー内の正しい位置に「自動的に」追加する必要があります。

また、実際のグラフィカルツリーの形式でデータを視覚化できるようにしたいと考えています。ツリーは巨大になるので、ビジュアライゼーションにズーム/パンコントロールが必要になります。そしてもちろん、きれいな視覚化は醜いものよりも常に優れています。

これをすべて簡単に実現できるPythonパッケージを知っている人はいますか?自分でコードを書くにはかなり時間がかかります。このタスクにはhttp://packages.python.org/ete2/が適切だと思いますか?

私はPython2.xを使用しています。


NLTKにはトライクラス(nltk.containers.trie)があることを発見しました。私はすでにNLTKを使用しているので、これは私にとって便利です。このクラスの使い方を知っている人はいますか?どこにも例が見つかりません!たとえば、トライに単語を追加するにはどうすればよいですか?

4

2 に答える 2

4

ETE2はツリー探索用の環境であり、原則として系統樹の閲覧、構築、および探索のために作成されており、私はずっと前からこれらの目的で使用してきました。しかし、データを適切に設定すれば、それを実行できる可能性があります。

ツリーを分割してブランチを作成する必要がある場所に括弧を配置するだけです。ETE doc から抜粋した次の例を参照してください。これらの「(A,B,(C,D));」を変更すると、あなたの言葉/手紙のためにそれは行われるべきです。

from ete2 import Tree
unrooted_tree = Tree( "(A,B,(C,D));" )
print unrooted_tree

出力:

     /-A
    |
----|--B
    |
    |     /-C
     \---|
          \-D

...そして、このパッケージでは、必要な操作のほとんどを行うことができ、すべてのブランチを個別に選択する機会が与えられ、簡単な方法で操作できます。とにかくチュートリアルを見ることをお勧めします。それほど難しくありません:)

于 2012-06-04T09:44:21.587 に答える
3

次の例は、 ETEツールキットを使用して、ほとんどのことを行っていると思います。

from ete2 import Tree

words = [ "reel", "road", "root", "curd", "curl", "whatever","whenever", "wherever"]

#Creates a empty tree
tree = Tree()
tree.name = ""
# Lets keep tree structure indexed
name2node = {}
# Make sure there are no duplicates
words = set(words)
# Populate tree
for wd in words:
    # If no similar words exist, add it to the base of tree
    target = tree

    # Find relatives in the tree
    for pos in xrange(len(wd), -1, -1):
        root = wd[:pos]
        if root in name2node:
            target = name2node[root]
            break

    # Add new nodes as necessary
    fullname = root 
    for letter in wd[pos:]:
        fullname += letter 
        new_node = target.add_child(name=letter, dist=1.0)
        name2node[fullname] = new_node

        target = new_node

# Print structure
print tree.get_ascii()
# You can also use all the visualization machinery from ETE
# (http://packages.python.org/ete2/tutorial/tutorial_drawing.html)
# tree.show()

# You can find, isolate and operate with a specific node using the index
wh_node = name2node["whe"]
print wh_node.get_ascii()

# You can rebuild words under a given node
def recontruct_fullname(node):
    name = []
    while node.up:
        name.append(node.name)
        node = node.up
    name = ''.join(reversed(name))
    return name

for leaf in wh_node.iter_leaves():
    print recontruct_fullname(leaf)


                    /n-- /e-- /v-- /e-- /-r
               /e--|
     /w-- /h--|     \r-- /e-- /v-- /e-- /-r
    |         |
    |          \a-- /t-- /e-- /v-- /e-- /-r
    |
    |     /e-- /e-- /-l
----|-r--|
    |    |     /o-- /-t
    |     \o--|
    |          \a-- /-d
    |
    |               /-d
     \c-- /u-- /r--|
                    \-l
于 2012-08-01T11:05:47.270 に答える