【问题标题】:spaCy: optimizing tokenizationspaCy:优化标记化
【发布时间】:2019-03-24 15:33:37
【问题描述】:

我目前正在尝试标记一个文本文件,其中每一行都是推文的正文:

"According to data reported to FINRA, short volume percent for $SALT clocked in at 39.19% on 12-29-17 http://www.volumebot.com/?s=SALT"
"@Good2go @krueb The chart I posted definitely supports ng going lower.  Gobstopper' 2.12, might even be conservative."
"@Crypt0Fortune Its not dumping as bad as it used to...."
"$XVG.X LOL. Someone just triggered a cascade of stop-loss orders and scooped up morons' coins. Oldest trick in the stock trader's book."

该文件长 59,397 行(一天的数据量),我正在使用 spaCy 进行预处理/标记化。目前我花了大约 8.5 分钟,我想知道是否有任何方法可以优化以下代码以更快,因为 8.5 分钟对于这个过程来说似乎非常长:

def token_loop(path):
    store = []
    files = [f for f in listdir(path) if isfile(join(path, f))]

    start_time = time.monotonic()
    for filename in files:
        with open("./data/"+filename) as f:
            for line in f:
                tokens = nlp(line.lower())
                tokens = [token.lemma_ for token in tokens if not token.orth_.isspace() and token.is_alpha and not token.is_stop and len(token.orth_) != 1]
                store.append(tokens)

    end_time = time.monotonic()
    print("Time taken to tokenize:",timedelta(seconds=end_time - start_time))

    return store

虽然它说的是文件,但它目前只循环了 1 个文件。

请注意,我只需要这个来标记内容;我不需要任何额外的标记等。

【问题讨论】:

    标签: machine-learning nlp spacy


    【解决方案1】:

    听起来您还没有优化管道。禁用不需要的管道组件将显着加快速度,如下所示:

    nlp = spacy.load('en', disable=['parser', 'tagger', 'ner'])    
    

    这应该可以让您降低到大约两分钟的时间,或者更好,就其本身而言。

    如果您需要进一步加速,可以使用nlp.pipe 查看多线程。多线程的文档在这里: https://spacy.io/usage/processing-pipelines#section-multithreading

    【讨论】:

    • 非常好,非常感谢。只是为了更好地理解,假设我的用例是在将标记放入 word2vec 之前标记这些行。我是否需要 POS 标记、命名实体或解析器?我已经在 PCA 图上绘制了每个结果,它们往往有很大的不同(对所有这些都是新的,所以无法理解它!),这些额外的选项对于创建词嵌入来说是不必要的吗?
    • 它们是不必要的。但是 Spacy 确实内置了向量表示(小型模型除外——请参阅此处的模型文档:spacy.io/usage/models.)你的目标是什么?
    • 使用自己的数据构建 Twitter 内容推荐系统的非常早期的阶段,到目前为止,我所做的只是基于这些令牌创建了一个 word2vec 模型,并且我必须在某个时候研究 RNN。没有机器学习背景,所以现在有点混乱。
    • 好的,我明白了——听起来是个不错的项目!有很多不同的方法可以解决这个问题。坚持使用 Spacy,您可以查看向量相似性:spacy.io/usage/spacy-101#vectors-similarity。此外,您可能已经接触过它,但 Gensim (radimrehurek.com/gensim) 是一个很棒的主题建模、文档/文本相似性等库。绝对值得一试。
    • 为什么不nlp = spacy.load('en', disable=['parser', 'tagger', 'ner', 'entity_ruler'])?他只想tokenize,所以他也不需要实体统治者
    【解决方案2】:

    您可以使用nlp.pipe(all_lines) 代替 nlp(line) 来加快处理速度

    请参阅 Spacy 的文档 - https://spacy.io/usage/processing-pipelines

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多