使用spacy构建vocab

2024-09-27 21:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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的功能


Tags: indocsforifspacysentencemaxword
1条回答
网友
1楼 · 发布于 2024-09-27 21:34:21

你可以做一些事情来加快速度

import spacy
from collections import Counter

def build_vocab(texts, max_vocab=10000, min_freq=3):
    nlp = spacy.blank("en") # just the tokenizer
    wc = Counter()
    for doc in nlp.pipe(texts):
        for word in doc:
            wc[word.lower_] += 1

    word2id = {}
    id2word = {}
    for word, count in wc.most_common():
        if count < min_freq: break
        if len(word2id) >= max_vocab: break
        wid = len(word2id)
        word2id[word] = wid
        id2word[wid] = word
    return word2id, id2word

说明:

  1. 如果只使用标记器,则可以使用spacy.blank
  2. nlp.pipe对于大量文本来说速度很快(不太重要,但可能与空白模型无关)
  3. Counter针对此类计数任务进行了优化

另一件事是,在最初的示例中,您构建vocab的方式是,您将使用具有足够标记的前N个单词,而不是前N个单词,这可能是错误的

另一件事是,如果您使用spaCy,您不应该以这种方式构建vocab—spaCy有自己的内置vocab类,用于处理将令牌转换为ID的问题。我猜您可能需要为下游任务或其他任务使用此映射,但请查看vocab docs,看看是否可以使用它

相关问题 更多 >

    热门问题