You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tutorial_3_embedding.rst 6.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. =========================================
  2. 使用Embedding模块将文本转成向量
  3. =========================================
  4. 这一部分是一个关于在fastNLP当中使用embedding的教程。
  5. 教程目录:
  6. - `Part I: embedding介绍`_
  7. - `Part II: 使用随机初始化的embedding`_
  8. - `Part III: 使用预训练的静态embedding`_
  9. - `Part IV: 使用预训练的Contextual Embedding(ELMo & BERT)`_
  10. - `Part V: 使用character-level的embedding`_
  11. - `Part VI: 叠加使用多个embedding`_
  12. - `Part VII: fastNLP支持的预训练Embedding`_
  13. ---------------------------------------
  14. Part I: embedding介绍
  15. ---------------------------------------
  16. 与torch.nn.Embedding类似,fastNLP的embedding接受的输入是一个被index好的序列,输出的内容是这个序列的embedding结果。
  17. fastNLP的embedding包括了预训练embedding和随机初始化embedding。
  18. ---------------------------------------
  19. Part II: 使用随机初始化的embedding
  20. ---------------------------------------
  21. 使用随机初始化的embedding参见 :class:`~fastNLP.embeddings.embedding.Embedding` 。
  22. 可以传入词表大小和embedding维度:
  23. .. code-block:: python
  24. from fastNLP import Embedding
  25. embed = Embedding(10000, 50)
  26. 也可以传入一个初始化的参数矩阵:
  27. .. code-block:: python
  28. from fastNLP import Embedding
  29. embed = Embedding(init_embed)
  30. 其中的init_embed可以是torch.FloatTensor、torch.nn.Embedding或者numpy.ndarray。
  31. ---------------------------------------
  32. Part III: 使用预训练的静态embedding
  33. ---------------------------------------
  34. 在使用预训练的embedding之前,需要根据数据集的内容构建一个词表 :class:`~fastNLP.core.vocabulary.Vocabulary` ,在
  35. 预训练embedding类初始化的时候需要将这个词表作为参数传入。
  36. 在fastNLP中,我们提供了 :class:`~fastNLP.embeddings.StaticEmbedding` 这一个类。
  37. 通过 :class:`~fastNLP.embeddings.StaticEmbedding` 可以加载预训练好的静态
  38. Embedding,例子如下:
  39. .. code-block:: python
  40. from fastNLP import StaticEmbedding
  41. embed = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  42. vocab为根据数据集构建的词表,model_dir_or_name可以是一个路径,也可以是embedding模型的名称:
  43. 1 如果传入的是路径,那么fastNLP将会根据该路径来读取预训练的权重文件并将embedding加载进来(glove
  44. 和word2vec类型的权重文件都支持)
  45. 2 如果传入的是模型名称,那么fastNLP将会根据名称查找embedding模型,如果在cache目录下找到模型则会
  46. 自动加载;如果找不到则会自动下载到cache目录。默认的cache目录为 `~/.fastNLP` 文件夹。可以通过环境
  47. 变量 ``FASTNLP_CACHE_DIR`` 来自定义cache目录,如::
  48. $ FASTNLP_CACHE_DIR=~/fastnlp_cache_dir python your_python_file.py
  49. 这个命令表示fastNLP将会在 `~/fastnlp_cache_dir` 这个目录下寻找模型,找不到则会自动将模型下载到这个目录
  50. -----------------------------------------------------------
  51. Part IV: 使用预训练的Contextual Embedding(ELMo & BERT)
  52. -----------------------------------------------------------
  53. 在fastNLP中,我们提供了ELMo和BERT的embedding: :class:`~fastNLP.embeddings.ElmoEmbedding`
  54. 和 :class:`~fastNLP.embeddings.BertEmbedding` 。
  55. 与静态embedding类似,ELMo的使用方法如下:
  56. .. code-block:: python
  57. from fastNLP import ElmoEmbedding
  58. embed = ElmoEmbedding(vocab, model_dir_or_name='small', requires_grad=False)
  59. BERT-embedding的使用方法如下:
  60. .. code-block:: python
  61. from fastNLP import BertEmbedding
  62. embed = BertEmbedding(
  63. vocab, model_dir_or_name='en-base-cased', requires_grad=False, layers='4,-2,-1'
  64. )
  65. 其中layers变量表示需要取哪几层的encode结果。
  66. -----------------------------------------------------
  67. Part V: 使用character-level的embedding
  68. -----------------------------------------------------
  69. 除了预训练的embedding以外,fastNLP还提供了CharEmbedding: :class:`~fastNLP.embeddings.CNNCharEmbedding` 和
  70. :class:`~fastNLP.embeddings.LSTMCharEmbedding` 。
  71. CNNCharEmbedding的使用例子如下:
  72. .. code-block:: python
  73. from fastNLP import CNNCharEmbedding
  74. embed = CNNCharEmbedding(vocab, embed_size=100, char_emb_size=50)
  75. 这表示这个CNNCharEmbedding当中character的embedding维度大小为50,返回的embedding结果维度大小为100。
  76. 与CNNCharEmbedding类似,LSTMCharEmbedding的使用例子如下:
  77. .. code-block:: python
  78. from fastNLP import LSTMCharEmbedding
  79. embed = LSTMCharEmbedding(vocab, embed_size=100, char_emb_size=50)
  80. 这表示这个LSTMCharEmbedding当中character的embedding维度大小为50,返回的embedding结果维度大小为100。
  81. -----------------------------------------------------
  82. Part VI: 叠加使用多个embedding
  83. -----------------------------------------------------
  84. 在fastNLP中,我们使用 :class:`~fastNLP.embeddings.StackEmbedding` 来叠加多个embedding
  85. 例子如下:
  86. .. code-block:: python
  87. from fastNLP import StaticEmbedding, StackEmbedding
  88. embed_1 = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  89. embed_2 = StaticEmbedding(vocab, model_dir_or_name='en-word2vec-300', requires_grad=True)
  90. stack_embed = StackEmbedding([embed_1, embed_2])
  91. StackEmbedding会把多个embedding的结果拼接起来,如上面例子的stack_embed返回的embedding维度为350维。
  92. 除此以外,还可以把静态embedding跟上下文相关的embedding拼接起来:
  93. .. code-block:: python
  94. from fastNLP import StaticEmbedding, StackEmbedding, ElmoEmbedding
  95. elmo_embedding = ElmoEmbedding(vocab, model_dir_or_name='medium', layers='0,1,2', requires_grad=False)
  96. glove_embedding = StaticEmbedding(vocab, model_dir_or_name='en-glove-6b-50', requires_grad=True)
  97. stack_embed = StackEmbedding([elmo_embedding, glove_embedding])
  98. ------------------------------------------
  99. Part VII: fastNLP支持的预训练Embedding
  100. ------------------------------------------
  101. fastNLP支持多种预训练Embedding并提供自动下载功能,具体参见文档
  102. `fastNLP可加载的embedding与数据集 <https://docs.qq.com/sheet/DVnpkTnF6VW9UeXdh?c=A1A0A0>`_