fastNLP.core.vocabulary

class fastNLP.core.vocabulary.Vocabulary(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]

别名 fastNLP.Vocabulary fastNLP.core.vocabulary.Vocabulary

用于构建, 存储和使用 strint 的一一映射:

vocab = Vocabulary()
word_list = "this is a word list".split()
vocab.update(word_list)
vocab["word"] # str to int
vocab.to_word(5) # int to str
__init__(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]
参数:
  • max_size (int) -- Vocabulary 的最大大小, 即能存储词的最大数量 若为 None , 则不限制大小. Default: None
  • min_freq (int) -- 能被记录下的词在文本中的最小出现频率, 应大于或等于 1. 若小于该频率, 词语将被视为 unknown. 若为 None , 所有文本中的词都被记录. Default: None
  • optional padding (str) -- padding的字符. 如果设置为 None , 则vocabulary中不考虑padding, 也不计入词表大小,为 None 的情况多在为label建立Vocabulary的情况. Default: '<pad>'
  • optional unknown (str) -- unknown的字符,所有未被记录的词在转为 int 时将被视为unknown. 如果设置为 None ,则vocabulary中不考虑unknow, 也不计入词表大小. 为 None 的情况多在为label建立Vocabulary的情况. Default: '<unk>'
add(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word(word, no_create_entry=False)[源代码]

增加一个新词在词典中的出现频率

参数:
  • word (str) -- 新词
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
add_word_lst(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list[str]) -- 词的序列
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。
build_reverse_vocab()[源代码]

基于 word to index dict, 构建 index to word dict.

build_vocab()[源代码]

根据已经出现的词和出现频率构建词典. 注意: 重复构建可能会改变词典的大小, 但已经记录在词典中的词, 不会改变对应的 int

clear()[源代码]

删除Vocabulary中的词表数据。相当于重新初始化一下。

返回:
from_dataset(*datasets, field_name, no_create_entry_dataset=None)[源代码]

使用dataset的对应field中词构建词典:

# remember to use `field_name`
vocab.from_dataset(train_data1, train_data2, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (str,List[str]) -- 可为 strList[str] . 构建词典所使用的 field(s), 支持一个或多个field,若有多个 DataSet, 每个DataSet都必须有这些field. 目前支持的field结构 : str , List[str]
  • no_create_entry_dataset -- 可以传入DataSet, List[DataSet]或者None(默认),该选项用在接下来的模型会使用pretrain 的embedding(包括glove, word2vec, elmo与bert)且会finetune的情况。如果仅使用来自于train的数据建立vocabulary,会导致test与dev 中的数据无法充分利用到来自于预训练embedding的信息,所以在建立词表的时候将test与dev考虑进来会使得最终的结果更好。 如果一个词出现在了train中,但是没在预训练模型中,embedding会为它用unk初始化,但它是单独的一个vector,如果 finetune embedding的话,这个词在更新之后可能会有更好的表示; 而如果这个词仅出现在了dev或test中,那么就不能为它们单独建立vector, 而应该让它指向unk这个vector的值。所以只位于no_create_entry_dataset中的token,将首先从预训练的词表中寻找它的表示, 如果找到了,就使用该表示; 如果没有找到,则认为该词的表示应该为unk的表示。
Return self:
has_word(w)[源代码]

检查词是否被记录:

has_abc = vocab.has_word('abc')
# equals to
has_abc = 'abc' in vocab
参数:item -- the word
返回:True or False
index_dataset(*datasets, field_name, new_field_name=None)[源代码]

将DataSet中对应field的词转为数字,Example:

# remember to use `field_name`
vocab.index_dataset(train_data, dev_data, test_data, field_name='words')
参数:
  • datasets (DataSet,List[DataSet]) -- 需要转index的一个或多个数据集
  • field_name (list,str) -- 需要转index的field, 若有多个 DataSet, 每个DataSet都必须有此 field. 目前支持 str , List[str]
  • new_field_name (list,str) -- 保存结果的field_name. 若为 None , 将覆盖原field. Default: None.
static load(filepath)[源代码]
参数:filepath (str,io.StringIO) -- Vocabulary的读取路径
返回:Vocabulary
padding_idx

padding 对应的数字

save(filepath)[源代码]
参数:filepath (str,io.StringIO) -- Vocabulary的储存路径
返回:
to_index(w)[源代码]

将词转为数字. 若词不再词典中被记录, 将视为 unknown, 若 unknown=None , 将抛出 ValueError

index = vocab.to_index('abc')
# equals to
index = vocab['abc']
参数:w (str) -- a word
Return int index:
 the number
to_word(idx)[源代码]

给定一个数字, 将其转为对应的词.

参数:idx (int) -- the index
Return str word:
 the word
unknown_idx

unknown 对应的数字.

update(word_lst, no_create_entry=False)[源代码]

依次增加序列中词在词典中的出现频率

参数:
  • word_lst (list) -- a list of strings
  • no_create_entry (bool) -- 在使用fastNLP.TokenEmbedding加载预训练模型时,没有从预训练词表中找到这个词的处理方式。 如果为True,则不会有这个词语创建一个单独的entry,它将一直被指向unk的表示; 如果为False,则为这个词创建一个单独 的entry。如果这个word来自于dev或者test,一般设置为True,如果来自与train一般设置为False。以下两种情况: 如果新 加入一个word,且no_create_entry为True,但这个词之前已经在Vocabulary中且并不是no_create_entry的,则还是会为这 个词创建一个单独的vector; 如果no_create_entry为False,但这个词之前已经在Vocabulary中且并不是no_create_entry的, 则这个词将认为是需要创建单独的vector的。