我看到的所有使用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
答案 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)