fastNLP.core.vocabulary¶
-
class
fastNLP.core.vocabulary.
Vocabulary
(max_size=None, min_freq=None, padding='<pad>', unknown='<unk>')[源代码]¶ 别名
fastNLP.Vocabulary
fastNLP.core.vocabulary.Vocabulary
用于构建, 存储和使用 str 到 int 的一一映射:
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>'
-
update
(word_lst, no_create_entry=False)[源代码]¶ 依次增加序列中词在词典中的出现频率
- 参数
word_lst (list) -- a list of strings
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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, no_create_entry=False)[源代码]¶ 增加一个新词在词典中的出现频率
- 参数
word (str) -- 新词
no_create_entry (bool) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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) -- 如果词语来自于非训练集建议设置为True。在使用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的。
-
has_word
(w)[源代码]¶ 检查词是否被记录:
has_abc = vocab.has_word('abc') # equals to has_abc = 'abc' in vocab
- 参数
item -- the word
- 返回
True
orFalse
-
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')
-
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')
- 参数
field_name (str,List[str]) -- 可为
str
或List[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
-
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
-
property
unknown_idx
¶ unknown 对应的数字.
-
property
padding_idx
¶ padding 对应的数字
-