前言
大家上午好,这里是我们《AIGC》系列的第一篇内容。如果有小伙伴也对AIGC感兴趣,可以关注AIGC这个专栏,今后我还会继续更新这个系列,我们一起体验这段有趣的过程🚀🚀🚀。
引入
话不多说,先给大家介绍一下AIGC。
生成式人工智能------AIGC(Artificial Intelligence Generated Content),是指基于生成对抗网络、大型预训练模型等人工智能的技术方法,通过已有数据的学习和识别,以适当的泛化能力生成相关内容的技术。
而自然语言处理(NLP)是人工智能领域中的一个重要分支,致力于使计算机能够理解、解释和生成人类语言。在NLP的学习过程中,初学者经常会接触到一些基础任务,其中包括 分词 、 词性标注 和 命名实体识别(NER) 。这些任务构成了NLP的基础,为更高级的语言处理任务奠定了基础。
那么今天我们就来了解一下这三个任务。
使用前的准备工作
Colaboratory
在开始之前,我们要注册登录 colab.research.google.com/ 这个网站,我们今天讲的所有操作都是在这个平台上进行的。
Colab是一个由Google提供的免费GPU的Jupyter云服务平台。在个人电脑没有足够计算资源的情况下,可以登录这个平台进行一些较小规模的计算。
一。分词:理解语言的基本单元
分词是NLP中的第一步,它涉及将文本拆分成词汇单元,为后续处理提供基本的语言结构。
需要注意的是,python中有多种分词方法,像基于空格的分词、NLTK库分词、 Jieba分词、正则表达式分词等等,我们这里用到的是Transformers库
使用 Transformers 库实现分词
transformers
库是Hugging Face开发的一个流行的自然语言处理库,它基于Py用transformers实现分词模块ensorFlow,提供了各种预训练的NLP模型,包括BERT、GPT、RoBERTa等。
接下来我们来看看transformers库是如何实现分词模块的。
1.安装 Transformers 库:
python
!pip install transformers
这行代码使用了 !pip
命令,它通常在命令行环境中执行。在代码中直接执行 !pip install transformers
会安装 Transformers 库,如果我们在命令行中运行代码,可以在命令行中执行这个命令来安装。
-
导入 BertTokenizer:
pythonfrom transformers import BertTokenizer
首先,从 Transformers 库中导入 BERT 分词器。
-
初始化分词器:
pythontokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
通过
BertTokenizer.from_pretrained
方法,我们初始化了一个预训练的 BERT 分词器,使用的是 "bert-base-uncased" 模型。 -
输入文本:
pythontext = str("Transformers make natural language processing tasks easy.")
我们创建一个字符串
text
,准备对这个文本进行分词和编码。 -
分词和编码:
pythonencoding = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
通过调用
tokenizer
对象,将文本进行了分词和编码。参数return_tensors='pt'
表示返回 PyTorch 张量。padding=True
表示对序列进行填充,truncation=True
表示截断文本,确保其长度符合模型的输入要求。 -
获取输入张量:
pythontokens = encoding['input_ids']
从编码结果中提取了 'input_ids' 键对应的张量,它包含了经过分词和编码的文本。
-
将 token IDs 转为词汇:
pythondecoded_tokens = tokenizer.convert_ids_to_tokens(tokens[0].tolist())
使用分词器的
convert_ids_to_tokens
方法将 token IDs 转换回单词。 -
打印结果:
pythonprint("原始文本:", text) print("分词结果:", decoded_tokens)
最后,我们打印原始文本和分词结果。
结果如下图所示:
这个过程将文本转换为了 BERT 模型可接受的输入形式,其中 tokens
是一个包含了分词后的文本对应的 token IDs 的 PyTorch 张量。而 decoded_tokens
是将 token IDs 转换回词汇的结果。
二、词性标注:了解词汇的语法角色
使用 NLTK 库实现词性标注
一旦文本被分词,下一步就是为每个词汇赋予词性标签。
词性标注可以帮助我们理解每个词汇在句子中的语法角色,为进一步的语法分析和语义理解提供支持。
这段代码使用了 NLTK(Natural Language Toolkit)库来进行词性标注。接下来我们来看看NLTK库如何实现词性标注。
-
导入NLTK库:
pythonimport nltk from nltk import pos_tag from nltk.tokenize import word_tokenize
首先,我们要用到NLTK库,先导入NLTK库及其相关模块。其中,
pos_tag
用于进行词性标注,word_tokenize
用于对文本进行分词。 -
下载NLTK数据:
pythonnltk.download('punkt') nltk.download('averaged_perceptron_tagger')
下载NLTK所需的数据,其中 'punkt' 是用于分词的数据,'averaged_perceptron_tagger' 是用于词性标注的数据。
-
输入文本:
pythontext = "Natural language processing is a fascinating field."
这里提供要进行词性标注的文本。
-
分词:
pythonwords = word_tokenize(text)
使用
word_tokenize
对文本进行分词,将文本拆分成单词。 -
词性标注:
pythonpos_tags = pos_tag(words)
使用
pos_tag
对分词后的单词进行词性标注,得到每个单词及其对应的词性标签。 -
打印结果:
pythonprint("原始文本:", text) print("词性标注结果:", pos_tags)
打印原始文本和词性标注的结果。
这样,就完成了一个简单的词性标注任务,得到了输入文本中每个单词的词性标签。NLTK中的 pos_tag
方法使用的是基于感知器的平均模型,它在处理一般文本时效果比较好。这个例子演示了NLTK库如何帮助我们进行自然语言处理中的基本任务。
拓展一下
这里,得出的结果比较抽象,如果我们想要它变成我们能看懂的样子,应该怎么做呢?
我们可以将NLTK中的词性标签映射到更常见的词性名称:
python
import nltk
from nltk import pos_tag
from nltk.tokenize import word_tokenize
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
def simplify_pos_tag(tag):
if tag.startswith('N'):
return 'Noun'
elif tag.startswith('V'):
return 'Verb'
elif tag.startswith('R'):
return 'Adverb'
elif tag.startswith('J'):
return 'Adjective'
else:
return 'Other'
# 输入文本
text = "Natural language processing is a fascinating field."
# 分词
words = word_tokenize(text)
# 词性标注
pos_tags = pos_tag(words)
# 简化词性标签
simplified_pos_tags = [(word, simplify_pos_tag(tag)) for word, tag in pos_tags]
# 打印结果
print("原始文本:", text)
print("词性标注结果:", simplified_pos_tags)
现在得出的词性标注我们就能看懂了,在这个例子中,我们定义了一个简化词性标签的函数 simplify_pos_tag
,将NLTK的词性标签映射到更通用的词性名称。这样,最终的输出结果更容易理解。
Adjective 形容词
Noun 名词
Verb 动词
Other 其他
三、命名实体识别:发现文本中的重要实体
命名实体识别是NLP中的关键任务,它涉及在文本中识别并分类命名实体,如人名、地名、组织机构等。
使用 spaCy 库实现命名实体识别
在Python中,我们可以使用NLTK库或spaCy库来进行命名实体识别(Named Entity Recognition,简称NER)。下面我们使用spaCy库进行简单的命名实体识别。
首先,确保已经安装了spaCy库:
bash
!pip install spacy
然后,下载并安装英语模型:
bash
python -m spacy download en_core_web_sm
现在,我们可以使用以下代码进行命名实体识别:
python
import spacy
# 加载英语模型
nlp = spacy.load("en_core_web_sm")
# 输入文本
text = "Apple Inc. was founded by Steve Jobs and Steve Wozniak in 1976. It is headquartered in Cupertino, California."
# 处理文本
doc = nlp(text)
# 打印命名实体
print("原始文本:", text)
print("命名实体识别结果:")
for ent in doc.ents:
print(f"{ent.text} - {ent.label_}")
这样我们就得出结果,这个例子中,命名实体识别结果包括公司名("Apple Inc.")、人名("Steve Jobs"和"Steve Wozniak")、日期("1976")等。
拓展一下
ORG
:组织PERSON
:人名DATE
:日期GPE
:地点(国家、城市等)
如果对这些标签不太熟悉,可以查阅spaCy的文档以获取更多信息。
另外,为了更好地展示和解释结果,可以将结果中的标签转换为更常见的术语,例如:
ORG
转为 "组织"PERSON
转为 "人名"DATE
转为 "日期"GPE
转为 "地点"
下面是转换标签的代码:
python
import spacy
# 加载英语模型
nlp = spacy.load("en_core_web_sm")
# 输入文本
text = "Apple Inc. was founded by Steve Jobs and Steve Wozniak in 1976. It is headquartered in Cupertino, California."
# 处理文本
doc = nlp(text)
# 转换标签为更常见的术语
def convert_label(label):
if label == "ORG":
return "组织"
elif label == "PERSON":
return "人名"
elif label == "DATE":
return "日期"
elif label == "GPE":
return "地点"
else:
return label
# 打印命名实体(转换后的标签)
print("原始文本:", text)
print("命名实体识别结果:")
for ent in doc.ents:
converted_label = convert_label(ent.label_)
print(f"{ent.text} - {converted_label}")
这样,输出中的命名实体标签就以更常见的术语呈现了。
结语
那么我们今天的内容就结束啦,欢迎各路大神在评论区讨论~~
点赞收藏不迷路,咱们下期再见ヾ( ̄▽ ̄)ByeBye~