自然语言处理基础
目录
1 文本处理
hanlp
命名实体
词性标注
2 文本的张量表示
3文本数据分析
3.1标签数量分布
3.2句子分布
map函数
pseg 词性标注
3.3绘制词云图
4文本的特征处理
n-gram
文本的长度规范
5文本数据增强
1 文本处理
分词 中文 jieba 中英文的 hanlp基于tensorflow2.0
jieba的三种模式 精准模式(将文本最精确的分隔开适合文本分析)
搜索引擎模式(将精准模式上的长词在进行切分)
全模式(只要是词语都将会被拆分)
使用用户自定义的字典进行分词,提高整体的识别准确率
# 精准模式
content1 = jieba.lcut(content, cut_all=False)
# ['工信处', '女干事', '每月', '经过', '下属', '科室', '都', '要',
# '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '上', '的', '工作']
# 全模式
content2 = jieba.lcut(content, cut_all=True)# ['工信处', '处女', '女干事', '干事', '每月', '月经', '经过', '下属', '科室', '都', '要', '亲口',
# '口交', '交代', '24', '口交', '交换', '交换机', '换机', '等', '技术', '技术性', '性器', '器件', '的', '安装', '装上', '的', '工作']
# 搜索引擎模式
content3 = jieba.lcut_for_search(content)# ['工信处', '干事', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24',
# '口', '交换', '换机', '交换机', '等', '技术', '技术性', '器件', '的', '安装', '上', '的', '工作']
content4 ='八一双鹿更名为八一南昌篮球队!'
content5 = jieba.lcut(content4)#['八', '一双', '鹿', '更名', '为', '八一', '南昌', '篮球队', '!']
jieba.load_userdict('./jieba.txt')
云计算 5 n
李小福 2 nr
easy_install 3eng
好用 30
韩玉赏鉴 3 nz
八一双鹿 3 nz
content6 = jieba.lcut(content4)
# ['八一双鹿', '更名', '为', '八一', '南昌', '篮球队', '!']
hanlp
tokenizer = hanlp.load('CTB6_CONVSEG')
tokenizer('工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作')
# 工信处’,'女’,'干事’,'每’,'月’,'经过’,'下’,'属’,'科室’,'都’,'要','亲口',英文
tokenizer=hanlp.utils.rules.tokenize_english
tokenizer('Mr, Hankcs bought hankcs.com for 1.5 thousand dollars.')
['Mr.','Hankcs','bought','hankcs.com','for','1.5','thousand','dollars','.']
命名实体
将文本中的可能存在实体识别出来
鲁迅,浙江绍兴人,五四新文化运动的重要参与者,代表作朝花夕拾
鲁迅(人名)/浙江绍兴(地名)人 /五四新文化运动(专有名词)/重要参与者 /代表作
加载中文命名实体识别的预训练模型MSRA_NER_BERT_BASE_ZHrecognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)#
这里注意它的输入是对句子进行字符分割的列表,1ist(上海华安工业(集团)公司董事长遭旭光和秘书张晚霞来到美 国纽约现代艺术博物观。’)
recognizer(list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆'))
[('上海华安工业(集团)公司','NT',0,12),('谭旭光’,'NR',15,18),('张晚霞','NR',21
# 返回结果是一个装有n个元组的列表,每个元组代表一个命名实体,元组中的每一项分别代表具体的命名实体,
词性标注
import jieba.posseg as psegprint(pseg.lcut('我爱大唐不夜城'))[pair('我', 'r'), pair('爱', 'v'), pair('大唐', 'nz'), pair('不夜城', 'i')]
>>> import hanlp
# 加载中文命名实体识别的预训练模型CTB5_POS_RNN_FASTTEXT-ZH
>>> tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
tagger(['我'"的”,'希望''是''希望''和平'])
#结果返回对应的词性
['PN','DEG','NN',·VC','VV','NN']# 加载英文文命名实体识别的预训练模型CTB5_POS_RNN_FASTTEXT-EH
2 文本的张量表示
文本张量表示的作用:
将文本表示成张量(矩阵)形式,能够使语言文本可以作为计算机处理程序的输入,进行接下来一系列的解析工作
["人生”,"该’,"如何","起头”]
# 每个词对应矩阵中的一个向量
[[1.32,4,32,0,32,5.2]
[3.1,5.43,0.34,3.2],
[3.21,5.32,2,4.32],
[2.54,7.32,5.12,9.54]]
one-hot编码 Word2vec Word Embedding
one-hot编码 又称独热编码,将每个词表示成具有n个元素的向量,这个词向量中只有一个元素是1,其他元素都是0,不同词汇元素为0的位置不同,其中n的大小是整个语料中不同词汇的总数.
3文本数据分析
帮助我们理解语料,检查可能存在的问题,指导模型超参数的选择.
常见的分析方法: 标签数量分布 句子长度分布,词频统计与关键词词云
3.1标签数量分布
通过画图分析训练集与测试集的标签分布数量,来判断是否对数据进行增强还是删减.
seaborn.countplot(x=None, y=None, hue=None, data=None)
对数据进行分类绘图,x按照什么分类,hue可以进行分组.
3.2句子分布
sns.histplot
是 Seaborn 库中用于绘制直方图的函数,用于进行统计.
chain扁平化列表,将多行多列转化为一行一列
from itertools import chain# 定义一个二维列表
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]# 使用 chain 扁平化列表
flattened_list = list(chain(*nested_list))[1, 2, 3, 4, 5, 6, 7, 8, 9]
map函数
map(功能,数据)
numbers = [1, 2, 3, 4, 5]# 使用 map() 函数和内置的 square 函数计算每个元素的平方
squared_numbers = map(lambda x: x ** 2, numbers)
pseg 词性标注
通常指的是 jieba
库中的词性标注模块 jieba.posseg
pseg.cut
方法会对输入的文本进行处理,返回一个可迭代对象,其中每个元素是一个包含词语和其对应词性的元组。 返回的一个是单词.word 一个是文本flag
for g in pseg.luct(text):
if g.flag== 'a'
r.append(g.word)
3.3绘制词云图
from wordcloud import WordCloud
传入词云图的数据需要为间隔为空格的字符串
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt# 示例文本
text = "自然语言处理是一门融语言学、计算机科学、数学于一体的科学。它正被广泛应用于机器翻译、文本摘要、问答系统等领域。"# 进行中文分词
seg_list = jieba.lcut(text)
# 将分词结果用空格连接成字符串
text_for_wordcloud = " ".join(seg_list)# 生成词云图
wordcloud = WordCloud(font_path="simhei.ttf", # 设置字体,解决中文乱码问题,这里使用系统自带的黑体字,你也可以指定其他中文字体路径width=800,height=400,background_color="white"
).generate(text_for_wordcloud)# 显示词云图
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
4文本的特征处理
本特征处理包括为语料添加具有普适性的文本特征,如:n-gram特征
以及对加入特征之后的文本语料进行必要的处理,如: 长度规范,
n-gram
常用的n为 2 或 3
分词列表:【"是谁",“敲动","我心”】
映射列表为:[1,34,21]
我们可以认为数值映射列表中的每个数字是词汇特征,我们还可以把"是谁"和"敲动"两个词共同出现且相邻也作为一种特征加入到序列列表中假设1000就代表“是谁"和"敲动"共同出现且相邻(当是谁和敲动共同出现且相邻)[1,34,21,1000]
zip()对列表进行打包 set 去重
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']# 使用 zip() 函数打包两个列表
zipped = zip(list1, list2)# 将迭代器转换为列表以便查看结果
result = list(zipped)
print(result)
最终输出 [(1, 'a'), (2, 'b'), (3, 'c')]
。
return set( zip (* [input[i:] for i in range(n)])) 将input分为两个列表 一个从1开始 一个从2 开始 ,
将这两个列表打包,去重
文本的长度规范
一般的模型输入为等大小的矩阵,,输入模型前 对文本数值映射后的长度进行规范 ,分析众数,然后将长的去除,短的补0
from keras.preprocessing import sequencex_train=【[1,23,5,32,55,63,2,21,78,32,23,1]
[2,32,1,23,1]]res= sequence.pad_sequences(x_train,10)【[,5,32,55,63,2,21,78,32,23,1] 去除前两个
[ 0,0,0,0,0,2,32,1,23,1]] 不足的补0
5文本数据增强
回忆数据增强法
接入google的翻译接口将源文本数据翻译为小语种在翻译回来.
缺点 在翻译短句子时候重复率高不能增大样本的特证空间.
# google的翻译接口
from googletrans import Translatorn1_examp = '这家饭店不错'
n2_examp = '这家的价格便宜'translator = Translator()# 翻译translations = translator.translate([n1_examp, n2_examp], dest='en')
# 翻译后的结果
en_res = list(map(lambda x : x.text, translations))