最近,我正在研究一个由多个基因组块组成的基因组数据集.在以前的自然语言处理工作中,我已经使用了nltk中的sent_tokenizeword_tokenize来对句子和单词进行标记化.但是,当我在基因组数据集上使用这些函数时,它不能正确地对基因组进行标记化.下面的文本显示了基因组数据集的某些部分.

>NR_004049 1
tattattatacacaatcccggggcgttctatatagttatgtataatgtat
atttatattatttatgcctctaactggaacgtaccttgagcatatatgct
gtgacccgaaagatggtgaactatacttgatcaggttgaagtcaggggaa
accctgatggaagaccgaaacagttctgacgtgcaaatcgattgtcagaa
ttgagtataggggcgaaagaccaatcgaaccatctagtagctggttcctt
ccgaagtttccctcaggatagctggtgcattttaatattatataaaataa
tcttatctggtaaagcgaatgattagaggccttagggtcgaaacgatctt
aacctattctcaaactttaaatgggtaagaaccttaactttcttgatatg
aagttcaaggttatgatataatgtgcccagtgggccacttttggtaagca
gaactggcgctgtgggatgaaccaaacgtaatgttacggtgcccaaataa
caact
>NR_004048 1
aatgttttatataaattgcagtatgtgtcacccaaaatagcaaaccccat
aaccaaccagattattatgatacataatgcttatatgaaactaagacatt
tcgcaacatttattttaggtatataaatacatttattgaaggaattgata
tatgccagtaaaatggtgtatttttaatttctttcaataaaaacataatt
gacattatataaaaatgaattataaaactctaagcggtggatcactcggc
tcatgggtcgatgaagaacgcagcaaactgtgcgtcatcgtgtgaactgc
aggacacatgaacatcgacattttgaacgcatatcgcagtccatgctgtt
atgtactttaattaattttatagtgctgcttggactacatatggttgagg
gttgtaagactatgctaattaagttgcttataaatttttataagcatatg
gtatattattggataaatataataatttttattcataatattaaaaaata
aatgaaaaacattatctcacatttgaatgt
>NR_004047 1
atattcaggttcatcgggcttaacctctaagcagtttcacgtactgttta
actctctattcagagttcttttcaactttccctcacggtacttgtttact
atcggtctcatggttatatttagtgtttagatggagtttaccacccactt
agtgctgcactatcaagcaacactgactctttggaaacatcatctagtaa
tcattaacgttatacgggcctggcaccctctatgggtaaatggcctcatt
taagaaggacttaaatcgctaatttctcatactagaatattgacgctcca
tacactgcatctcacatttgccatatagacaaagtgacttagtgctgaac
tgtcttctttacggtcgccgctactaagaaaatccttggtagttactttt
cctcccctaattaatatgcttaaattcagggggtagtcccatatgagttg
>NR_004052 1

在此数据集上应用ntlk的标记器时,每行文本(例如tattattatacacaatcccggggcgttctatatagttatgtataatgtat)将变成一个不正确的标记.并且序列块应该被认为是一个令牌.例如,在本例中,>NR_004049 1>NR_004048 1之间的内容应被视为一个令牌:

>NR_004049 1
tattattatacacaatcccggggcgttctatatagttatgtataatgtat
atttatattatttatgcctctaactggaacgtaccttgagcatatatgct
gtgacccgaaagatggtgaactatacttgatcaggttgaagtcaggggaa
accctgatggaagaccgaaacagttctgacgtgcaaatcgattgtcagaa
ttgagtataggggcgaaagaccaatcgaaccatctagtagctggttcctt
ccgaagtttccctcaggatagctggtgcattttaatattatataaaataa
tcttatctggtaaagcgaatgattagaggccttagggtcgaaacgatctt
aacctattctcaaactttaaatgggtaagaaccttaactttcttgatatg
aagttcaaggttatgatataatgtgcccagtgggccacttttggtaagca
gaactggcgctgtgggatgaaccaaacgtaatgttacggtgcccaaataa
caact
>NR_004048 1 

因此,每个以特殊单词(如>NR_004049 1)开始直到下一个特殊字符的块都应被视为一个令牌.这里的问题是对这种数据集进行标记化,我不知道如何正确地对它们进行标记化. 我真的很感激那些帮助我解决这个问题的答案.

一百零二 解决此问题的一种方法是在每个块中附加所有行,然后使用nltk标记器.例如,这意味着将>NR_004049 1>NR_004048 1之间的所有行附加到多个行中形成一个字符串,因此nltk标记器会将其视为一个标记.谁能帮助我如何在每个块中追加行?

推荐答案

显然,您只需要连接两个ID之间的行.应该不需要nltk或任何记号赋值器,只需要一点编程;)


patterns = {}
with open('data', "r") as f:
    id = None
    current = ""
    for line0 in f:
        line= line0.rstrip()
        if line[0] == '>' :  # new pattern
            if len(current)>0:
#                print("adding "+id+"  "+current)
                patterns[id] = current
                current = ""
            # to find the next id:
            tokens = line.split(" ")
            id = tokens[0][1:]
        else: # continuing pattern
            current = current + line
    if len(current)>0:
        patterns[id] = current
#        print("adding "+id+"  "+current)


# do whatever with the patterns:
for id, pattern in patterns.items():
    print(f"{id}\t{pattern}")

Python相关问答推荐

在输入行运行时停止代码

为什么我的sundaram筛这么低效

计算空值

不允许 Select 北极滚动?

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

语法错误:文档. evaluate:表达式不是合法表达式

使用嵌套对象字段的Qdrant过滤

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

对于标准的原始类型注释,从键入`和`从www.example.com `?

极点:在固定点扩展窗口

Django-修改后的管理表单返回对象而不是文本

使用OpenPYXL切换图表上的行/列

将代码推送到服务器时,连接WebSocket时出错

Pandas 滚动着进化的windows

.yml不会在专用环境中安装来自.requirements.txt的软件包

Python渐进式打字

Django按字段上的子字符串分组

是否 Select 所有整型列,除了几个python-polars列?

用Arpeggio解析单行和多行注释

将Hangman游戏中的&替换为所有比赛的玩家猜测