在大文本文件中使用nltk进行句子分割

时间:2017-05-20 23:36:53

标签: python nltk tokenize

我需要使用nltk.sent_tokenize()从大文本文件中提取句子。文件大小从1MB到400MB不等,因此由于内存限制而无法完全加载文件,我认为不可能使用nltk.sent_tokenize()并逐行读取文件。

你有什么建议去做这个任务?

2 个答案:

答案 0 :(得分:4)

您是否尝试过只使用阅读器? nltk语料库阅读器旨在以递增方式提供文本,在幕后从磁盘读取大块而不是整个文件。因此,只需在整个语料库中打开一个PlaintextCorpusReader,就应该逐句传递整个语料库而不需要任何恶作剧。例如:

reader = nltk.corpus.reader.PlaintextCorpusReader("path/to/corpus", r".*\.txt")
for sent in reader.sents():
    if "shenanigans" in sent:
        print(" ".join(sent))

答案 1 :(得分:0)

流式传输文件并在逐行读取文件时对其进行处理。

如果用于存储令牌的内存存在问题,则逐行或分批编写进程令牌。

逐行:

from __future__ import print_function
from nltk import word_tokenize
with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout:
    for line in fin:
        tokenized_line = ' '.join(word_tokenize(line.strip()))
        print(tokenized_line, end='\n', file=fout)

批量(1000):

from __future__ import print_function
from nltk import word_tokenize
with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout:
    processed_lines = []
    for i, line in enumerate(fin):
        tokenized_line = ' '.join(word_tokenize(line.strip()))
        processed_lines.append(tokenized_line)
        if i % 1000 = 0:
            print('\n'.join(processed_lines), end='\n', file=fout)
            processed_lines = []