繁体   English   中英

使用 Dataflow 运行 spacy lemmatizer 的最有效方法

[英]Most efficient way to run spacy lemmatizer with Dataflow

我尝试处理来自 BigQuery 的数据。

我用 Apache Beam 创建了一个管道,如下所示:

nlp = fr_core_news_lg.load()

class CleanText(beam.DoFn):
  def process(self, row):
    row['descriptioncleaned'] = ' '.join(unidecode.unidecode(str(row['description'])).lower().translate(str.maketrans(string.punctuation, ' '*len(string.punctuation))).split())
    yield row

class LemmaText(beam.DoFn):
  def process(self, row):
    doc = nlp(row['descriptioncleaned'], disable=["tagger", "parser", "attribute_ruler", "ner", "textcat"])
    row['descriptionlemmatized'] = ' '.join(list(set([token.lemma_ for token in doc])))
    yield row

with beam.Pipeline(runner="direct", options=options) as pipeline:
  soft = pipeline \
  | "GetRows" >> beam.io.ReadFromBigQuery(table=table_spec, gcs_location="gs://mygs") \
  | "CleanText" >> beam.ParDo(CleanText()) \
  | "LemmaText" >> beam.ParDo(LemmaText()) \
  | 'WriteToBigQuery' >> beam.io.WriteToBigQuery('mybq', custom_gcs_temp_location="gs://mygs", create_disposition="CREATE_IF_NEEDED", write_disposition="WRITE_TRUNCATE")

基本上,它从我的 BigQuery 表中加载数据,清理其中一列(字符串类型),并使用 Spacy Lemmatizer 对其进行词形还原。 我有大约。 8M 行,每个字符串都很大,大约。 300 字。

最后,这一切总结起来需要超过 15 个小时才能完成。 我们必须每天运行它。

我真的不明白为什么在应该以并行方式运行的 DataFlow 上运行这么长时间。

我已经使用了 Spacy 的pipe ,但我无法真正使用 Apache Beam。

有没有办法使用 DataFlow 加速 Spacy 处理或更好地并行化它?

我对数据流一无所知,但对您的 spaCy 使用情况有一些观察...

您正在使用没有标记器的词形还原器。 这相对较快但质量较低,因为好的引理依赖于词性。 但是,如果您这样做,您应该使用nlp.blank("fr")并向其中添加词形还原器,否则尽管未使用tok2vec编码层仍将运行,这可能比词形还原器慢。 (我也不清楚spacy.load调用的执行频率,但是对blank的调用要快得多

我不确定您是否可以将 map 用于 Dataflow,但如果可能的话,您想使用nlp.pipe来提高速度。 另一方面,如果您不使用 tok2vec 或任何统计组件,它可能不会有太大的不同。 另请参阅速度常见问题解答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM