python - 在 Python 中使用 NLTK 为序列解析单个树
问题描述
我想解析一棵树的 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
"""
语法必须如下:
然后,我将语法更改如下,但仍然无法解析序列:
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
"""
解决方案
正如评论中所讨论的,您从两个基本问题开始:
你写的语法只能处理一个字符
你每次用一个字符调用你的解析器。
结果是每个字符的“解析”向量,分别。
修正语法后,如已编辑问题所示,更改调用以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)))))))))
推荐阅读
- java - Jacoco 测试失败。覆盖率始终为 0
- python - Discord py - 错误:无法提取 JS 播放器 URL
- deployment - Vercel:部署后运行节点脚本?
- python - 有没有更快的方法在python中循环图像
- pyspark - pyspark RDD中aggregateByKey的替代或更好的方法
- python - 如何有效地检查集合中变量的存在?
- reactjs - 从 root 启动时,React 脚本不启动
- php - Laravel:通过键数组获取模型属性
- java - TestNG 使用 Java 使用来自同一个 ArrayList 的数据运行多个测试
- python - 我怎么能结束这个游戏