我正在使用spacy标记器来标记我的数据,然后构建vocab
这是我的代码:
import spacy
nlp = spacy.load("en_core_web_sm")
def build_vocab(docs, max_vocab=10000, min_freq=3):
stoi = {'<PAD>':0, '<UNK>':1}
itos = {0:'<PAD>', 1:'<UNK>'}
word_freq = {}
idx = 2
for sentence in docs:
for word in [i.text.lower() for i in nlp(sentence)]:
if word not in word_freq:
word_freq[word] = 1
else:
word_freq[word] += 1
if word_freq[word] == min_freq:
if len(stoi) < max_vocab:
stoi[word] = idx
itos[idx] = word
idx += 1
return stoi, itos
但由于我有80多万句话,所以要花几个小时才能完成
有没有更快更好的方法来实现这一点?谢谢
更新:尝试删除最小频率:
def build_vocab(docs, max_vocab=10000):
stoi = {'<PAD>':0, '<UNK>':1}
itos = {0:'<PAD>', 1:'<UNK>'}
idx = 2
for sentence in docs:
for word in [i.text.lower() for i in nlp(sentence)]:
if word not in stoi:
if len(stoi) < max_vocab:
stoi[word] = idx
itos[idx] = word
idx += 1
return stoi, itos
仍然需要很长时间,spacy是否具有构建torchtext(.build_vocab)中的vocab的功能
你可以做一些事情来加快速度
说明:
spacy.blank
nlp.pipe
对于大量文本来说速度很快(不太重要,但可能与空白模型无关)Counter
针对此类计数任务进行了优化另一件事是,在最初的示例中,您构建vocab的方式是,您将使用具有足够标记的前N个单词,而不是前N个单词,这可能是错误的
另一件事是,如果您使用spaCy,您不应该以这种方式构建vocab—spaCy有自己的内置vocab类,用于处理将令牌转换为ID的问题。我猜您可能需要为下游任务或其他任务使用此映射,但请查看vocab docs,看看是否可以使用它
相关问题 更多 >
编程相关推荐