【问题标题】:How to find a capital letter words from an NLTK corpus using regex?如何使用正则表达式从 NLTK 语料库中查找大写字母单词?
【发布时间】:2020-08-28 10:01:09
【问题描述】:

我想制作一个包含所有大写字母的正则表达式的单词列表。 数据集是一堆称为语料库的生物论文文本文件。

len(corpus.fileids()) 的结果是 487,这意味着语料库中有 487 篇论文。

这样做的主要原因是收集词表来过滤基因名称等生物词(ATP,BRCA)

这里有一些我一直在尝试的代码。 (ps.我用的是python3)

我一直坚持使用函数来调用语料库中的所有文件。 对于单个文件,我认为这会起作用。

capital = re.findall(r'[A-Z]+', GNICorpus)

但问题是我必须浏览语料库中的这些 txt 文件中的所有单词并且不知道。 一审

import re
import nltk
from nltk.corpus import*
x = [
    (file)
    for file in Corpus.fileids() 
    for w in Corpus.words(file) 
    if w.upper()
]

二审

   capital = re.findall(r'[A-Z]+', Corpus)
   capital

三审

for fileid in Corpus.fileids():
    words = Corpus.words(fileid)
    capital = re.findall(r'[A-Z]+', words)

【问题讨论】:

  • 什么是Corpus?它是一个字符串吗?字符串列表?
  • 是否应该包含非ASCII大写字母(Ø)?
  • @Wiktor Stribiżew 我添加了更多解释!谢谢指出

标签: python regex nlp nltk corpus


【解决方案1】:

您的正则表达式将匹配一个单词中的单个(或多个)大写字母。

例如:

Corpus = "These are SOME words and someTHAT shouldNot match"
result = re.findall(r'[A-Z]+', Corpus)
>> ['T', 'SOME', 'THAT', 'N']

最好使用这个正则表达式(其中 \b 是单词边界):

# \b[A-Z]+\b

Corpus = "These are SOME words and someTHAT shouldNot match"
result = re.findall(r'\b[A-Z]+\b', Corpus)
>> ["SOME"]

但这一切都取决于你在寻找什么。

【讨论】:

  • 请注意,Corpus 似乎不是 OP 代码中的字符串。
  • 谢谢!但是,即使使用大数据集,我们也能做到这一点吗?我在问题中添加了更多细节。
【解决方案2】:

您可能不需要为此目的使用正则表达式,但在您的用例中它更快 =)

假设输入是文本,这是可行的

import re 

text = "These are SOME words and someTHAT shouldNot match"
result = re.findall(r'\b[A-Z]+\b', text)

使用https://docs.python.org/3/library/stdtypes.html#str.isupper,这也可以:

text = "These are SOME words and someTHAT shouldNot match"
result = [word for word in text.split() if word.isupper()]

假设GNICorpus

来自https://www.ncbi.nlm.nih.gov/pubmed/30309207,很可能来自https://github.com/Ewha-Bio/Genomics-Informatics-Corpus

from nltk.corpus import PlaintextCorpusReader

root_dir = 'Genomics-Informatics-Corpus/GNI Corpus 1.0'
GNICorpus = PlaintextCorpusReader(root_dir, '.*\.txt', encoding='utf-8')

GNICorpus 对象有一个.raw() 函数,它将连接对象中的所有文件并返回一个str

>>> type(GNICorpus.raw())
str

在这种情况下,正则表达式可以应用于原始字符串,例如

re.findall(r'\b[A-Z]+\b', GNICorpus.raw())

并且要使用str.isupper 函数而不是正则表达式,可以使用.words() 函数遍历语料库对象中的每个标记,即

[word for word in GNICorpus.words() if word.isupper()]

您会发现正则表达式比遍历.words() 快得多。如果您有兴趣,在线上有很多正则表达式与 Python 的本机字符串讨论。

但是等等!如果我们能用这种方法找到“基因序列”呢?

我们可以指定[ATCG]序列,而不是[A-Z]

from collections import Counter
Counter(re.findall(r'\b[ATCG]+\b', GNICorpus.raw()))

[出]:

Counter({'G': 1249,
         'CA': 958,
         'A': 6558,
         'CCCTC': 21,
         'C': 2981,
         'T': 1284,
         'CTCT': 3,
         'AG': 64,
         'AACC': 3,
         'AA': 28,
         'CC': 131,
         'TCGA': 122,
         'GT': 427,
         'GAGGGAGGGAGCGAGA': 3,
         'GC': 122,
         'GA': 102,
         'TGACGTCA': 3,
         'TCA': 15,
         'GCG': 4,
         'AGG': 12,
         'ACA': 3,
         'GCA': 3,
         'GTG': 3,
         'AGT': 6,
         'GAA': 3,
         'GAC': 18,
         'AGA': 6,
         'ACC': 7,
         'CTT': 11,
         'TGC': 12,
         'AGC': 3,
         'TCC': 7,
         'TTC': 6,
         'GTT': 4,
         'ACG': 12,
         'ATG': 4,
         'GAG': 9,
         'GGG': 3,
         'AAT': 3,
         'ACAGC': 3,
         'AT': 35,
         'TG': 270,
         'GGTCAACAAATCATAAAGATATTGG': 3,
         'TAAACTTCAGGGTGACCAAAAAATCA': 3,
         'TA': 17,
         'CT': 61,
         'CGC': 20,
         'TC': 100,
         'GG': 23,
         'CG': 15,
         'AC': 6,
         'CCCTCT': 4,
         'TT': 124,
         'CAGT': 3,
         'TCTG': 3,
         'ATCC': 61,
         'AAAAACAACAAGATAA': 3,
         'GATA': 6,
         'CACCC': 3,
         'ATC': 275,
         'GGCGCCATCTT': 3,
         'TCTGAGCC': 3,
         'CGCC': 3,
         'GCTA': 7,
         'AAA': 2,
         'AAG': 30,
         'GTA': 4,
         'ATT': 4,
         'AAC': 4,
         'CAT': 8,
         'GGC': 6,
         'TAA': 6,
         'TTT': 9,
         'CAG': 3,
         'TGG': 3,
         'CCT': 11,
         'CTC': 273,
         'CCG': 12,
         'GCT': 271,
         'TAG': 3,
         'TAT': 7,
         'CAC': 6,
         'TAC': 8,
         'TCG': 3,
         'TTG': 6,
         'ATA': 21,
         'TTAGGG': 3,
         'CACTA': 3,
         'TATA': 19,
         'CCA': 31,
         'CCC': 4,
         'CGT': 3,
         'CGA': 3,
         'CGG': 3,
         'GTC': 268,
         'GGCAGG': 246,
         'CGTGCCCCAGCCCAGTC': 1,
         'TTCCAGTACAGCCCATCCAATAAG': 1,
         'TGCGAGGGCTGCGAGGTC': 1,
         'TGTCAGCTTGCGTGTGGTTGC': 1,
         'GTAACCCGTTGCACCCCATT': 1,
         'CCATCCAATCGGTAGTAGCG': 1,
         'GACGATGCTCCCCGGGCTGTATTC': 1,
         'TCTCTTGCTCTGGGCCTCGTCACC': 1,
         'TCTTAACTGCCGGATCCACAAAAA': 1,
         'ATCTCCGCCAACAGCTTCTCCTTC': 1,
         'GGGCAGCCTCCGTTTGATGGT': 1,
         'CGCTTGGCAGGGTGTTTGGTC': 1,
         'GCCATCGAGGAGTGCCAATACC': 1,
         'GGCCACACCTGCTGAAGAGATG': 1,
         'GTAGCCCCAGTGGAGAGCCTTGTG': 1,
         'ATGCCAGTGGGGAGTTTGTTATCG': 1,
         'TGAATCGGACCCACTTGAGAGG': 1,
         'CAGGAGCGGCTTGTTTGAGGTA': 1,
         'GGAGGCGCCGAGACTTAGGT': 1,
         'GCGGGTGAGCACAGCAGAGC': 1,
         'TCATCCCGAATAAAAGCGAAGAGC': 1,
         'AGGGCAACAACATTAGCAGGAGAT': 1,
         'GATGTGATCCGACATTACA': 1,
         'CTAGAACTGCTCTGTATGT': 1,
         'CAATTCGGCAAGTAATGGA': 1,
         'GTCTCTTCGGGAACTGCAAG': 1,
         'TGGGACACAGGCACTGTAGA': 1,
         'GCTCTCTGCTCCTCCTGTTC': 1,
         'CAATACGACCAAATCCGTTG': 1,
         'ATCG': 10,
         'TCGT': 2,
         'TGAT': 1,
         'CGTG': 1,
         'CGTT': 1,
         'CATC': 1,
         'GTGA': 1,
         'ATCGT': 4,
         'TCGTG': 1,
         'TCGTT': 1,
         'CGTGA': 1,
         'CATCG': 1,
         'GTGAT': 1,
         'CGTGAT': 1,
         'CATCGT': 1,
         'TCGTGA': 1,
         'TCGTGAT': 1,
         'ATCGTGACT': 1,
         'CGTGATT': 2,
         'GTGACT': 1,
         'ATCGTT': 1,
         'ATCGTGAGA': 1,
         'GTGAAG': 1,
         'GTGATTG': 1,
         'GTGATT': 1,
         'TCGTGACT': 3,
         'TCGATTG': 3,
         'TCGTGAGA': 3,
         'TTACT': 3,
         'ACT': 5,
         'ATTG': 2,
         'GATTG': 1,
         'TGTGTAGAGCTCCTCG': 1,
         'TTAAA': 1,
         'GGCG': 1,
         'TACCTGCATGCTGCGGTGAAG': 1,
         'AGGGCTGTGTAGAAGTACTCGC': 1,
         'TTTT': 2,
         'AATAAA': 1,
         'TCGTGCA': 1,
         'TCTACCTCGACAG': 1,
         'CCTCCTCCT': 1,
         'CCTTGGTTTTC': 1,
         'GAAATCCCATCACCATCTTCCAGG': 1,
         'GAGCCCCAGCCTTCTCCATG': 1,
         'AACACCA': 1,
         'CGCTCCCGCCTTACTTCGCA': 1,
         'TTAGCTTGCCTCGTCCCC': 1,
         'TTTCGACACTGGATGGCG': 1,
         'TTGCGTTGCGTAGGGGGGAT': 1,
         'TTTAAA': 2,
         'GATATC': 1,
         'AGTATC': 1,
         'CGTCTGTGAGGGGAGCGTTT': 1,
         'TGATTTTGATGACGAGCGTAAT': 1,
         'GATGTGAGAACTGTATCCTAGCAAG': 1,
         'GGCTGGCCTGTTGAACAAGTCTGGA': 1,
         'ATAC': 1,
         'GTCGGAGTCAACGGATTTG': 1,
         'TGGGTGGAATCA': 1,
         'TATTGGA': 1,
         'AGAAAAAGCAACCACGAAGC': 1,
         'AAACCTCTGTCTGTGAGTGCC': 1,
         'TATT': 1,
         'ACCC': 1,
         'GCCA': 15,
         'CAAT': 1,
         'AGAC': 11,
         'GCTCCCGCCTTACTTCGCAT': 1,
         'CGGGGACGAGGCAAGCTAA': 1,
         'GCCGCCATCCAGTGTCG': 1,
         'TTGCGTTGCGTAGGGGGG': 1})

如果我想设置最小数量怎么办?字符序列?

如果我们想将最小字符设置为4,而不是+,可以使用{4,}

from collections import Counter
Counter(re.findall(r'\b[ATCG]{4,}\b', GNICorpus.raw()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多