Python 使用NLTK创建一个新的语料库,该语料库忽略输入文件中的某些字符串,并且不将它们输入语料库

Python 使用NLTK创建一个新的语料库,该语料库忽略输入文件中的某些字符串,并且不将它们输入语料库,python,nltk,corpus,Python,Nltk,Corpus,我正试图用一组文本文件创建自己的语料库。但是,我想在文本文件被语料库化之前对其进行一些预处理,我不知道如何做,除非先创建一个脚本来运行每个文本文件,进行文本预处理,保存一个新的文本文件,然后在新的后处理文件上创建语料库。这看起来效率很低,因为我有大约200 mb的文件,我需要读两遍,如果我有一个更大的语料库,就不能真正扩展 我想做的预处理是非常基本的文本操作: 使每个单词都符合语料库中的小写字母 移除括号内的所有项目,例如[咳嗽] 删除每行开头的数字。它们是原始记录中的行号,是每行的前四个字符

我正试图用一组文本文件创建自己的语料库。但是,我想在文本文件被语料库化之前对其进行一些预处理,我不知道如何做,除非先创建一个脚本来运行每个文本文件,进行文本预处理,保存一个新的文本文件,然后在新的后处理文件上创建语料库。这看起来效率很低,因为我有大约200 mb的文件,我需要读两遍,如果我有一个更大的语料库,就不能真正扩展

我想做的预处理是非常基本的文本操作:

使每个单词都符合语料库中的小写字母 移除括号内的所有项目,例如[咳嗽] 删除每行开头的数字。它们是原始记录中的行号,是每行的前四个字符 关键的是,我想在单词进入语料库之前做这个预处理——我不想,例如,[coughing]或0001作为我的语料库中的一个条目,我想要的是TREE而不是TREE

我已经有了基本的语料库阅读器代码,但问题是,在模式匹配读取文件和构建语料库时,我不知道如何修改模式匹配。有什么好办法吗

corpusdir = "C:/corpus/"     
newcorpus = PlaintextCorpusReader(corpusdir, '.*') 
corpus_words = newcorpus.words()     # get words in the corpus 
fdist = nltk.FreqDist(corpus_words)  # make frequency distribution of the words in the corpus
看起来有点正确,但是相关的单词已经在语料库中,海报想要在标记语料库之前忽略/去除标点符号。我想影响哪种类型的词甚至被输入,也就是说,在语料库中计数


提前谢谢

我不同意你的低效评论,因为一旦处理完语料库,你就可以多次分析处理过的语料库,而不必每次都运行清理功能。这就是说,如果你要运行多次,也许你会想找到一个更快的选择

据我所知,PlaintextCorpusReader需要文件作为输入。我使用了Alvas回答另一个问题的代码来构建这个响应。请参阅Alvas关于使用PlaintextCorpusReader的精彩回答

以下是我的工作流程:

from glob import glob
import re
import os
from nltk.corpus import PlaintextCorpusReader
from nltk.probability import FreqDist as FreqDist

mycorpusdir = glob('path/to/your/corpus/*')

# captures bracket-ed text 
re_brackets = r'(\[.*?\])'
# exactly 4 numbers
re_numbers = r'(\d{4})'
将所有内容小写,删除数字:

corpus = []
for file in mycorpusdir:
    f = open(file).read()
    # lowercase everything
    all_lower = f.lower()
    # remove brackets
    no_brackets = re.sub(re_brackets, '', all_lower)
    # remove #### numbers
    just_words = re.sub(re_numbers, '', no_brackets)
    corpus.append(just_words)
为已处理的语料库创建新目录:

corpusdir = 'newcorpus/'
if not os.path.isdir(corpusdir):
    os.mkdir(corpusdir)

# Output the files into the directory.
filename = 0
for text in corpus:
    with open(corpusdir + str(filename) + '.txt' , 'w+') as fout:
        print(text, file=fout)
    filename += 1
调用PlaintextCorpusReader:


谢谢-这基本上就是我最后做的预处理文件来做我的文本处理,然后将预处理文件保存为新文件,然后在新文件上运行PlaintextCorpusReader。我已经看到了阿尔瓦斯的精彩答案,并对其投了赞成票,但谢谢你的指点!我想我已经同意了,先对所有文件进行两次预处理,然后进行语料库化并不是那么低效。你的代码是一个很好的方法。我只是想看看是否有一种方法可以在进入语料库的过程中进行文本处理。
newcorpus = PlaintextCorpusReader('newcorpus/', '.*')

corpus_words = newcorpus.words()
fdist = FreqDist(corpus_words)

print(fdist)