为 NLP 应用迭代 Numpy 数组

Iterating Over Numpy Array for NLP Application

我有一个正在构建的 Word2Vec 模型,其中 vocab_list 大约有 30k 个单词。我有一个大约 150k 的句子列表 (sentence_list)。我正在尝试从 vocab_list 中未包含的句子中删除标记(单词)。这个任务看起来很简单,但是使用下面的代码嵌套 for 循环和重新分配内存很慢。这项任务花了大约。 1 小时到 运行,所以我不想重复。

有没有更简洁的方法来尝试这个?

import numpy as np
from datetime import datetime

start=datetime.now()
timing=[]
result=[]
counter=0
for sent in sentences_list:
    counter+=1
    if counter %1000==0 or counter==1:
        print(counter, 'row of', len(sentences_list), ' Elapsed time: ', datetime.now()-start)
        timing.append([counter, datetime.now()-start])
    final_tokens=[]
    for token in sent:
        if token in vocab_list:
            final_tokens.append(token)
    #if len(final_tokens)>0:
    result.append(final_tokens)
print(counter, 'row of', len(sentences_list),' Elapsed time: ', datetime.now()-start)
timing.append([counter, datetime.now()-start])
sentences=result
del result
timing=pd.DataFrame(timing, columns=['Counter', 'Elapsed_Time'])

请注意,典型的 word2vec 实现(如 Google 的原始 word2vec.cgensim Word2Vec)通常会忽略其输入中不属于的单词他们既定的词汇表(由 vocab_list 指定或通过 min_count 强制执行)。所以你可能根本不需要执行这个过滤。

使用更惯用的 Python 列表理解 可能 明显更快(而且肯定会更紧凑)。您的代码可以简单地是:

filtered_sentences = [ 
    [word for word in sent if word in vocab_list] 
    for sent in sentences_list
]