在Python中使用NLTK解析序列的单个树

2024-05-05 13:17:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想分析一棵树的RNA序列。我在一个列表中标记了RNA序列,如下面的代码所示,并解析了树:

from __future__ import print_function
import nltk
import pdb
import numpy as np
import h5py
import RNA_vae
import equation_vae_copy
import RNA_grammar

sent = ['C', 'C', 'C', 'C', 'A', 'A', 'A', 'U', 'A', 'C', 'A', 'G', 'A', 'A', 'G', 'C', 'G', 'G', 'G', 'C', 'U', 'U', 'A']
parser = nltk.ChartParser(RNA_grammar.GCFG) 
parse_trees = [next(parser.parse(t)) for t in sent]

print(parse_trees)

但代码的输出如下所示:

[Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['U'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['G'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['A'])]), Tree('S', [Tree('L', ['G'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['G'])]), Tree('S', [Tree('L', ['G'])]), Tree('S', [Tree('L', ['G'])]), Tree('S', [Tree('L', ['C'])]), Tree('S', [Tree('L', ['U'])]), Tree('S', [Tree('L', ['U'])]), Tree('S', [Tree('L', ['A'])])]

我想为整个序列生成一棵树,但它为RNA中的每个字符生成树。如何为整个序列生成一棵树

语法如下:

# the RNA grammar
gram = """S -> LS
S -> L
LS -> L
LS -> S
L -> AFU
L -> UFA
L -> GFC
L -> CFG
L -> 'A'
L -> 'U'
L -> 'C'
L -> 'G'
F -> AFU
F -> UFA
F -> GFC
F -> CFG
F -> LS
AFU -> 'A'
AFU -> F
AFU -> 'U'
UFA -> 'U'
UFA -> F
UFA -> 'A'
GFC -> 'G'
GFC -> F
GFC -> 'C'
CFG -> 'C'
CFG -> F
CFG -> 'G'
Nothing -> Nones
"""

语法必须如下所示:

RNA grammar

然后,我对语法做了如下更改,但仍然无法解析序列:

gram = """S -> L S | L
L -> 'A' F 'U' | 'A' | 'U' F 'A' | 'U' | 'C' F 'G' | 'C' | 'G' F 'C' | 'G'
F -> 'A' F 'U' | 'U' F 'A' | 'C' F 'G' | 'G' F 'C' | L S
Nothing -> Nones
"""

Tags: 代码importtreeparse语法序列cfgls
1条回答
网友
1楼 · 发布于 2024-05-05 13:17:27

正如评论中所讨论的,您从两个基本问题开始:

  1. 你写的语法只能处理一个字符

  2. 您每次使用一个字符调用解析器

结果是分别对每个字符进行“解析”的向量

修正语法后,如编辑的问题中所示,将调用更改为parser.parse以提供要解析的整个序列将产生2100次可能的解析

以下是我所做的(您也可以通过将以下代码块复制到python控制台中来完成):

# import only what's needed
import nltk
# The grammar
grammar = """
S -> L S | L
L -> 'A' F 'U' | 'A' | 'U' F 'A' | 'U' | 'C' F 'G' | 'C' | 'G' F 'C' | 'G'
F -> 'A' F 'U' | 'U' F 'A' | 'C' F 'G' | 'G' F 'C' | L S
"""
# Make a chartparser
parser = nltk.ChartParser(nltk.CFG.fromstring(grammar))
# The test sentence
sent = ['C', 'C', 'C', 'C', 'A', 'A', 'A',
        'U', 'A', 'C', 'A', 'G', 'A', 'A',
        'G', 'C', 'G', 'G', 'G', 'C', 'U',
        'U', 'A'
       ]
# Get all of the parses
parses = list(parser.parse(sent))
# There are a lot of them. len(parses) is 2100.
# Print one of them to the console
parses[0].pprint()

上面印着:

(S
  (L C)
  (S
    (L C)
    (S
      (L C)
      (S
        (L C)
        (S
          (L A)
          (S
            (L A)
            (S
              (L A)
              (S
                (L
                  U
                  (F
                    (L A)
                    (S
                      (L C)
                      (S
                        (L A)
                        (S
                          (L G)
                          (S
                            (L
                              A
                              (F
                                A
                                (F G (F C (F (L G) (S (L G))) G) C)
                                U)
                              U))))))
                  A)))))))))

相关问题 更多 >