读取文本文件的语料库

时间:2018-09-23 16:11:47

标签: spacy

我看到的所有使用spacy的示例都只是读入一个文本文件(大小很小)。 如何将大量文本文件加载到spacy中?

我可以通过使语料库中的所有文本腌制来实现文本化:

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

for doc in docs:
    print(doc)

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

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

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

感谢您的帮助...

Ravi

3 个答案:

答案 0 :(得分:0)

如果可以将每行对应一个文档的方式将语料库转换为数据框,则基本上可以编写一个函数来执行想要的操作,然后:

df['new_column'] = df['document'].apply(lambda x: your_function(x))

或者,我不确定这是否是您想要的,但是您可以尝试执行以下操作:

import spacy
import os

nlp = spacy.load('en_core_web_lg')
docs ='path\\to\\the\\corpus_folder'

def get_filename(path):
    return [i.path for i in os.scandir(path) if i.is_file()]

files=get_filename(docs)
for filepath in files:
    with open(filepath, 'r') as file_to_read:
        some_text = file_to_read.read()
        print(os.path.basename(filepath))
        print(nlp(some_text))
        print([tok.text for tok in nlp.tokenizer(some_text) if not tok.is_stop])
        print('-'*40)

这是输出:

text1.txt
Read multiple files.
['Read', 'multiple', 'files', '.']
----------------------------------------
text2.txt
Read it, man.
['Read', ',', 'man', '.']
----------------------------------------

但是,它不是通过spaCy读取的。

答案 1 :(得分:0)

所以我终于完成了这项工作,并将其保留在这里以供后代使用。

从一个名为iterator的生成器开始,因为我目前非常害怕更改任何东西,以免它再次损坏:

def path_iterator(paths):
    for p in paths:
        print("yielding")
        yield p.open("r").read(25)

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

my_files = Path("/data/train").glob("*.txt")

此内容从上方包裹在我们的... 函数中,并传递给nlp.pipe。进去发电机,进来发电机。这里需要使用batch_size=5,否则它会变成先读取所有文件的坏习惯:

doc = nlp.pipe(path_iterator(my_paths), batch_size=5)

重要的部分以及我们执行所有操作的原因是,直到现在什么都没发生。我们不是在等待一千个文件的处理或其他任何事情。当您从docs开始阅读时,仅按需发生

for d in doc:
    print("A document!")

您将看到五个交替的块(上面的我们的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) 

答案 2 :(得分:0)

您一次只能读取一个文件。这是我通常使用的语料库文件:

import glob
import spacy
nlp = spacy.load("en_core_web_sm")
path = 'your path here\\*.txt'

for file in glob.glob(path):
    with open(file, encoding='utf-8', errors='ignore') as file_in:
        text = file_in.read()
        lines = text.split('\n')
        for line in lines:
            line = nlp(line)
            for token in line:
                print(token)