NLP -《基于PyTorch的自然语言处理》

 
新书《基于PyTorch的自然语言处理》的详细笔记!
主要是对这本书的代码部分的理解和处理,整理了处理方法的过程,这样可以给刚刚步入NLP的学者提供一些帮助。

 
博客的内容是按照文章章节的部分来整理的,大家可以选择部分内容进行学习。

欢迎转载,转载请注明出处https://blog.csdn.net/qq_41709378/article/details/113354298



 

第1章 概述

这部分主要是介绍了PyTorch中张量的基本概念,张量的类型大小,张量的基本操作,索引,切片和连接。

这里解决习题的代码:

import torch

# 1.随机创建一个二维张量,然后第0维插入1个维度
a = torch.rand(3, 3)
a.unsqueeze(0)
print(a)

# 2.去掉刚刚加入张量上的维度
a.squeeze(0)
print(a)

# 3.在区间[3, 7]中创建一个形状为5*3的随机向量
a = 3 + torch.rand(5, 3)*(7-3)
print(a)

# 4.创建一个具有正态分布(mean = 0, std = 1)值的张量
a = torch.rand(3,3)
a.normal_()
print(a)
print(a.normal_())

# 5.找到torch.Tensor([1,1,1,0,1])中所有非零元素的索引
a = torch.Tensor([1,1,1,0,1])
print(torch.nonzero(a))

# 6.创建一个大小为(31)的随机张量,水平扩展4个副本
a = torch.rand(3,1)
print(a.expand(3, 4))

# 7.返回两个3维矩阵的乘积(a=torch.rand(3,4,5), b=torch.rand(3,5,4))
a = torch.rand(3,4,5)
b = torch.rand(3,5,4)
print(torch.bmm(a,b))

# 8.返回一个3维矩阵和一个2维矩阵的乘积(a=torch.rand(3,4,5), b=torch.rand(5,4))
a = torch.rand(3,4,5)
b = torch.rand(5,4)
print(b.unsqueeze(0).expand(a.size(0), *b.size()))
print(torch.bmm(a, b.unsqueeze(0).expand(a.size(0), *b.size())))

 
 

第2章 自然语言处理

 
刚开始使用spacy包时,导入“en”.

import spacy
nlp = spacy.load("en")
text = "Mary, don't slap the green witch"
print([str(token) for token in nlp(text.lower())])

会出现以下问题:


OSError: [E050] Can’t find model ‘en’. 
It doesn’t seem to be a shortcut link, a Python package or a valid path to a data directory

 
解决方法一:

参考博客:https://blog.csdn.net/mr_muli/article/details/111592360

from spacy.lang.en import English
# 如下会报错:
#            import spacy
#            spacy_en = spacy.load('en')
#            return lambda s: [tok.text for tok in spacy_en.tokenizer(s)]
# 替换之后:

            from spacy.lang.en import English
            spacy_en = English()
            return lambda s: [tok.text for tok in spacy_en.tokenizer(s)]

 
解决方法二:

参考博客:https://github.com/hamelsmu/Seq2Seq_Tutorial/issues/1
参考博客:https://www.cnblogs.com/zrdm/p/8667131.html(这个是解决方法)
点击en_core_web_sm获得en_core_web_sm-2.2.0.tar

获得en_core_web_sm-2.2.0.tar后:
参考这篇博客:https://www.cnblogs.com/xiaolan-Lin/p/13286885.html
然后执行:

pip install en_core_web_sm-2.2.0.tar.gz

 
最后,代码如下:

import spacy

nlp = spacy.load("en_core_web_sm")
# nlp = spacy.load('en')
text = "Mary, don't slap the green witch"
print([str(token) for token in nlp(text.lower())])

 
 
这里第二章中的习题代码:


"""
第二章:自然语言处理
"""

# 例2-1:文本分词
"""
from spacy.lang.en import English
# 如下会报错:
#            import spacy
#            spacy_en = spacy.load('en')
#            return lambda s: [tok.text for tok in spacy_en.tokenizer(s)]
# 替换之后:

            from spacy.lang.en import English
            spacy_en = English()
            return lambda s: [tok.text for tok in spacy_en.tokenizer(s)]
"""
import spacy
nlp = spacy.load("en_core_web_sm")
# nlp = spacy.load('en')
text = "Mary, don't slap the green witch"
print([str(token) for token in nlp(text.lower())], '\n')

from nltk.tokenize import TweetTokenizer
tweet = u"Snow White and the Seven Degrees MakeAMovieCold@midnight:-)"
tokenizer = TweetTokenizer()
print(tokenizer.tokenize(tweet.lower()), "\n")


# 例2-2:从文本生成n元模型
def n_grams(text, n):
    return [text[i:i+n] for i in range(len(text)-n+1)]

cleand = ['mary', ',', "n't", 'slap', 'green', 'witch', '.']
print(n_grams(cleand, 3), "\n")


# 例2-3:词形还原:将单词还原为词根形式
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("he was running late")
for token in doc:
    print('{} --> {}'.format(token, token.lemma_))
print("\n")


# 例2-4:词性标注
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Mary slapped the green witch.")
for token in doc:
    print('{} --> {}'.format(token, token.pos_))
print("\n")


# 例2-5 名词短语(NP)分块
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Mary slapped the green witch.")
for chunk in doc.noun_chunks:
    print('{} --> {}'.format(chunk, chunk.label_))
print("\n")



 
 

第3章 神经网络基础

 
在学习 例3-5 时,会报错:

TypeError: prelu() missing 1 required positional arguments: "weight"

解决方法:

这里我们,需要加入权重a,注意的是加入权重a的类型为:torch.FloatTensor

# 例3-5:PRelu激活函数
import torch
import matplotlib.pyplot as plt
import numpy as np

prelu = torch.nn.PReLU(num_parameters = 1)
x = torch.range(-5., 5., 0.1)
a = torch.tensor([0.25])  # a为torch.FloatTensor数据类型
# a = torch.from_numpy(np.array(0.25)).int()  # 运用form_numpy()可以实现类型转换
y = torch.prelu(x, a)

plt.plot(x.numpy(), y.numpy())
plt.show()

第4章 用于自然语言处理的前馈网络

第5章 嵌入单词和类型

第6章 自然语言处理的序列建模

第7章 自然语言处理的中级序列建模

第8章 自然语言处理的高级序列建模

第9章 经典,前沿与下一步发展

猜你喜欢

转载自blog.csdn.net/qq_41709378/article/details/113354298