为 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.c
或 gensim
Word2Vec
)通常会忽略其输入中不属于的单词他们既定的词汇表(由 vocab_list
指定或通过 min_count
强制执行)。所以你可能根本不需要执行这个过滤。
使用更惯用的 Python 列表理解 可能 明显更快(而且肯定会更紧凑)。您的代码可以简单地是:
filtered_sentences = [
[word for word in sent if word in vocab_list]
for sent in sentences_list
]
我有一个正在构建的 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.c
或 gensim
Word2Vec
)通常会忽略其输入中不属于的单词他们既定的词汇表(由 vocab_list
指定或通过 min_count
强制执行)。所以你可能根本不需要执行这个过滤。
使用更惯用的 Python 列表理解 可能 明显更快(而且肯定会更紧凑)。您的代码可以简单地是:
filtered_sentences = [
[word for word in sent if word in vocab_list]
for sent in sentences_list
]