赞
踩
编者注:文中超链接如果不能访问可以点击“阅读原文”访问本文原页面;可以参考2018年5月21-24日伦敦Strata数据会议上的教学辅导课《使用spaCy和Spark NLP进行自然语言理解》。
在本博客系列的第一篇中我介绍了两个自然语言处理库(John Snow Labs的Apache Spark NLP和Explosion AI的spaCy),并用它们训练了分词和词性标注的模型。在本篇中我将继续构建并运行一个自然语言处理(NLP)管道,来把这些训练好的模型应用于新的文本数据。
导入测试数据是一个具有挑战性的步骤,因为我的测试数据是由未格式化的、未进行句子边界界定的文本构成的,是粗糙的和异构的。我要处理一个包含.txt文件的文件夹,并且需要将结果保存为文字标签的格式以便将其与正确的答案进行比较。下面让我们来解决它:
start = time.time()
path = “./target/testing/”
files = sorted([path + f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
prediction = {}
for file in files:
fo = io.open(file, mode=’r’, encoding=’utf-8′)
content = []
for doc in nlp_model(re.sub(“\\s+”, ‘ ‘, fo.read())):
content.append((doc.text, doc.tag_))
prediction[file] = content
fo.close()
print (time.time() – start)
另一种并行计算方法是使用generator和spaCy的语言管道。 像下面这样的方式也可以解决数据导入的问题。
from spacy.language import Language
import itertools
def genf():
path = “./target/testing/”
files = sorted([path + f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
for file in files:
fo = io.open(file, mode=’r’, encoding=’utf-8′)
t = re.sub(“\\s+”, ‘ ‘, fo.read())
fo.close()
yield (file, t)
gen1, gen2 = itertools.tee(genf())
files = (file for (file, text) in gen1)
texts = (text for (file, text) in gen2)
start = time.time()
prediction = {}
for file, doc in zip(files, nlp_model.pipe(texts, batch_size=10, n_threads=12)):
content = []
for d in doc:
content.append((d.text, d.tag_))
prediction[file] = content
print (time.time() – start)
var data = spark.read.textFile(“./target/testing”).as[String]
.map(_.trim()).filter(_.nonEmpty)
.withColumnRenamed(“value”, “text”)
.withColumn(“filename”, regexp_replace(input_file_name(), “file://”, “”))
data = data.groupBy(“filename”).agg(concat_ws(” “, collect_list(data(“text”))).as(“text”))
.repartition(12)
.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。