读取 spacy 中的文本文件语料库

Rav*_*avi 3 nlp pipeline generator multiprocessing spacy

我看到的使用 spacy 的所有示例都只是在单个文本文件(尺寸很小)中读取。如何将文本文件语料库加载到 spacy 中?

我可以通过腌制语料库中的所有文本来使用 textacy 来做到这一点:

docs =  textacy.io.spacy.read_spacy_docs('E:/spacy/DICKENS/dick.pkl', lang='en')

for doc in docs:
    print(doc)
Run Code Online (Sandbox Code Playgroud)

但我不清楚如何使用这个生成器对象(文档)进行进一步分析。

另外,我宁愿使用 spacy,而不是 textacy。

spacy 也无法读取单个大文件(~ 2000000 个字符)。

任何帮助表示赞赏...

拉维

Mat*_*tW. 7

所以我终于成功了,并将其保留在这里供子孙后代使用。

从一个生成器开始,这里命名是iterator因为我目前太害怕改变任何东西,因为担心它再次损坏:

def path_iterator(paths):
    for p in paths:
        print("yielding")
        yield p.open("r").read(25)
Run Code Online (Sandbox Code Playgroud)

获取迭代器、生成器或路径列表:

my_files = Path("/data/train").glob("*.txt")
Run Code Online (Sandbox Code Playgroud)

这从上面被包装在我们的 ...函数中,并传递给nlp.pipe. 输入发电机,输出发电机。这里是batch_size=5必需的,否则会陷入先读取所有文件的坏习惯:

doc = nlp.pipe(path_iterator(my_paths), batch_size=5)
Run Code Online (Sandbox Code Playgroud)

重要的是,我们做这一切的原因是,到目前为止还没有发生任何事情。我们不会等待处理一千个文件或其他任何事情。这仅在您开始阅读时按需docs发生:

for d in doc:
    print("A document!")
Run Code Online (Sandbox Code Playgroud)

您将看到交替的五个块(我们的batch_size,上面)“Yielding”和“A document”。现在它是一个实际的管道,启动后很快就会开始出现数据。

虽然我目前运行的版本稍旧,但致命一击是多处理:

# For those with these new AMD CPUs with hundreds of cores
doc = nlp.pipe(path_iterator(my_paths), batch_size=5, n_process=64) 
Run Code Online (Sandbox Code Playgroud)