IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Datawhale组队学习NLP_情感分析fasttext学习笔记 -> 正文阅读

[人工智能]Datawhale组队学习NLP_情感分析fasttext学习笔记

本文为学习Datawhale 2021.9组队学习情感分析笔记
原学习文档地址:https://github.com/datawhalechina/team-learning-nlp/tree/master/EmotionalAnalysis

baseline笔记见https://blog.csdn.net/weixin_43634785/article/details/120289701?spm=1001.2014.3001.5502

主要写需要注意的与baseline的不同点。
详细情况见原学习文档task3

1 加载数据

fasttext不是一个时序模型,不需要include_lengths=True了,但是它与其他文本分类模型的一个不同之处在于其计算了输入句子的n-gram,所以需要对数据进行生成n-grams的操作并读入这部分数据

下面是生成bigrams的函数

def generate_bigrams(x):
    n_grams = set(zip(*[x[i:] for i in range(2)]))
    for n_gram in n_grams:
        x.append(' '.join(n_gram))
    return x

分步查看得到

x = ['This', 'film', 'is', 'terrible']
print([x[i:] for i in range(2)])

y = [['This', 'film', 'is', 'terrible'], ['film', 'is', 'terrible']]
print(*y)
# 列表前面加个*,就是列表中所有元素解开成独立的参数,效果相当于去了一个[]

print(zip(*[x[i:] for i in range(2)]))
# 外面再加个zip就是把两个列表对应位置的元素组合起来,数量按少的那个算

print(*zip(*[x[i:] for i in range(2)]))
# 外面再加个*就是解压出来

print(set(zip(*[x[i:] for i in range(2)])))
# 利用set创建集合并去除重复元素

输出

[['This', 'film', 'is', 'terrible'], ['film', 'is', 'terrible']]
['This', 'film', 'is', 'terrible'] ['film', 'is', 'terrible']
<zip object at 0x0000024962F77088>
('This', 'film') ('film', 'is') ('is', 'terrible')
{('film', 'is'), ('is', 'terrible'), ('This', 'film')}

例子

generate_bigrams(['This', 'film', 'is', 'terrible'])
# ['This', 'film', 'is', 'terrible', 'film is', 'is terrible', 'This film']

加载数据时不需要include_lengths了,但需要preprocessing把bigrams加进去

TEXT = data.Field(tokenize = 'spacy',
                  tokenizer_language = 'en_core_web_sm',
                  preprocessing = generate_bigrams)

2 加载预训练词向量

MAX_VOCAB_SIZE = 25_000

TEXT.build_vocab(train_data,
                 max_size = MAX_VOCAB_SIZE,
                 vectors = "glove.6B.100d",
                 unk_init = torch.Tensor.normal_)

LABEL.build_vocab(train_data)

pretrained_embeddings = TEXT.vocab.vectors

# 用预训练的embedding词向量替换原始模型初始化的权重参数
model.embedding.weight.data.copy_(pretrained_embeddings)

# 将unk和padding token 设置为0
UNK_IDX = TEXT.vocab.stoi[TEXT.unk_token]

# 注意:与初始化嵌入一样,这应该在“weight.data”而不是“weight”上完成!
model.embedding.weight.data[UNK_IDX] = torch.zeros(EMBEDDING_DIM)
model.embedding.weight.data[PAD_IDX] = torch.zeros(EMBEDDING_DIM)

同样地,使用了glove预训练词向量

3 FastText模型

class FastText(nn.Module):
    def __init__(self, vocab_size, embedding_dim, output_dim, pad_idx):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=pad_idx)
        self.fc = nn.Linear(embedding_dim, output_dim)

    def forward(self, text):
        # text = [sent len, batch size]

        embedded = self.embedding(text)
        # embedded = [sent len, batch size, emb dim]

        embedded = embedded.permute(1, 0, 2)
        # embedded = [batch size, sent len, emb dim]
        # avg_pool2d input的要求是batch放第一位

        pooled = F.avg_pool2d(embedded, (embedded.shape[1], 1)).squeeze(1)
        # pooled = [batch size, emb dim] !!
        # 相当于将一个sent len长度句子的表示 [batch size, sent len, emb dim] 压缩(取平均值)成了 [batch size, emb dim]
        return self.fc(pooled)

结构很简单,输入的id先通过embedding得到一个句子里每一个单词的表示,然后再对所有单词的向量取个平均值,再加个线性层,就得到了输出。

4 FastText 、Embedding、Word2Vec

FastText与Word2Vec的结构很像,不同之处是fastText预测标签而CBOW预测的是中间词,即模型架构类似但是模型的任务不同。

都可以用预训练的Embedding,加个Embedding层做个转换就行了

FastText的效果不错,训练速度也快。他引入了n-grams特征对效果有提升,在训练的过程中还使用了一些技巧,比如层次softmax。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:59:01  更:2021-09-19 08:00:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 14:37:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码