文本处理技能与文本数据清洗、提取、分词与统计


前言

而在开始进行NLP的相关任务时,首先需要做一些预备工作,比如说数据清洗、提取等,接下来就让我们来看一下具体有哪些操作吧。

一、Linux的一些常用命令?

wc -l file: 看文件一共有多少行
more file: 观察部分文件
head -10 file: 查看文件的前10行内容
更多Linux命令请查看我的另一篇文章.

二、Python的一些常用操作

strip(): 去掉开始和结尾的空格
upper(): 将字符串转化为大写
index(s): 寻找字符串中s字符出现的位置
find(s): 寻找字符串中s字符出现的位置
注意:它们的区别在于find()如果在指定字符中没有找到则返回-1;而index则会抛出ValueError异常。
[::-1]: 反转字符串。
split(s): 以字符s分割字符串,默认的话是以空格来分割字符串。
s.join(list): 将列表中的每个元素用字符s连接起来。参数是要连接的元素序列。
Counter(): 对字符串\列表\元祖\字典进行计数,返回一个字典类型的数据,键是元素,值是元素出现的次数

# 举例
s = "hello-python-hello-world"
a = Counter(s)
print(a)
# 结果 
Counter({'-': 3, 'd': 1, 'e': 2, 'h': 3, 'l': 5, 'n': 1, 'o': 4, 'p': 1, 'r': 1, 't': 1, 'w': 1, 'y': 1})

re.findall(): 找到 RE 匹配的所有子串,并把它们作为一个列表返回

# re模块是使用正则表达式时主要使用到的模块
import re
str = 'abc!A_xyz'
# 下面语句的作用时去掉字母以外的相关字符
re.findall('[a-zA-Z]', str)

map(function, iterable, …): 会根据提供的函数对指定序列做映射,第一个参数时所要使用的功能(可以是自己定义的函数,也可以是匿名函数),第二个参数时迭代器,列表、字符串等。

>>> def square(x) :            # 计算平方数
...     return x ** 2
...
>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]

三、常用的一些自然语言处理工具包

使用工具包来对文档进行分词、词性标注、分类、指标评测等,可以使自然语言处理任务事半功倍。

3-1、nltk工具包

nltk可以用来干什么?
1、单词搜索
2、相似词搜索
3、相似关键词识别
4、词汇分布图
5、生成文本等等任务。
主要是用来英文分词的。

3-1-1、安装

1、使用命令安装:pip install nltk
2、下载数据包
github上的安装包地址.
nltk官方文档.
nltk官网的数据包下载地址(分散的数据).
看看就行了,在GitHub下载数据包需要梯子,巧了,恰好我没有。托好兄弟给我下载了,分享给在座的各位。
链接:https://pan.baidu.com/s/1vq-06QvknDYoo5uDKyAU-w
提取码:ilq8
解压后复制其中的packages文件夹,放在下列位置中的任意一个地方。
请添加图片描述
安装完成!!

3-1-2、nltk的使用

import nltk
import matplotlib
from nltk.book import *
from nltk.util import bigrams

# 单词搜索
# concordance(word)函数,搜索word及其上下文
print('单词搜索')
text1.concordance('boy')
text2.concordance('friends')

# 相似词搜索
# similar(word),搜索word及其相关的词语
print('相似词搜索')
text3.similar('time')

# 共同上下文搜索
# common_contexts([word1, word2...]): 搜索多个单词的上下文
print('共同上下文搜索')
text2.common_contexts(['monstrous','very'])

# 词汇分布表
# dispersion_plot([word1,word2,word3...]):画出词在文本中的位置,从文本开始的位置开始计算
print('词汇分布表')
text4.dispersion_plot(['citizens', 'American', 'freedom', 'duties'])

# 词汇计数
print('词汇计数')
print(len(text5))
sorted(set(text5))
print(len(set(text5)))

# 重复词密度
print('重复词密度')
print(len(text8) / len(set(text8)))

# 关键词密度
print('关键词密度')
print(text9.count('girl'))
print(text9.count('girl') * 100 / len(text9))

# 频率分布
# FreqDist(text)函数,返回text文本中每个词出现的次数的元组列表
fdist = FreqDist(text1)
vocabulary = fdist.keys()
for i in vocabulary:
    print(i)

# 高频前20
# plot(): 绘制出来top多少的词汇累计频率图
fdist.plot(20, cumulative = True)

# 低频词
# hapaxes(): 返回低频词
print('低频词:')
print(fdist.hapaxes())

# 词语搭配
# bigrams([word1, word2, word3])生成双连词,返回列表嵌套元组的形式。
print('词语搭配')
words = list(bigrams(['louder', 'words', 'speak']))
print(words)

3-2、jieba工具包‘

jieba分词是国内程序员用Python开发的一个中文分词模块,并且jieba分词包运用到了数据结构里的字典树对词语进行高效的分类,便于查找,支持三种分词模式:
1、精确模式,试图将句子精确的切开,适合文本分析
2、全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。
3、搜索引擎模式,在精确模式的基础上,对长词再进行切分,提高召回率,适合用于引擎分词。

3-2-1、jieba工具包安装

# 在anaconda环境下
conda install jieba
# 也可以使用pip
pip install jieba

3-2-2、jieba使用

注意: jieba.cut返回的是一个可以迭代的generator,可以使用for循环来获取每一个词语,而jieba.lcut直接返回的是一个list,他们的作用以及使用方式是相同的。

jieba分词方式

import jieba
# 以下是三种分词方式

# jieba.lcut('安徽理工大学的大学生')
# 精确模式: ['安徽', '理工大学', '的', '大学生']
# 增加专有名词 add_word()
# lcut返回的是一个列表
jieba.add_word('安徽理工大学')
jieba.lcut('安徽理工大学的大学生')
# 增加专有名词之后: ['安徽理工大学', '的', '大学生']

# cut_all: 是否采用全模式
# jieba.lcut('安徽理工大学的大学生',cut_all=True)
# 全模式: ['安徽', '安徽理工', '理工', '理工大', '理工大学', '工大', '大学', '的', '大学', '大学生', '学生']

jieba.lcut_for_search('安徽理工大学的大学生')
# #搜索引擎模式: ['安徽', '理工', '工大', '大学', '理工大', '理工大学', '的', '大学', '学生', '大学生']

# jieba.cut直接得到generator形式的分词结果
# notice:需要用join函数连接成一个字符串,结果的话和使用lcut是一样的,只是形式不一样。
seg = jieba.cut("征战四海只为今日一胜,我不会再败了。")  
print(' '.join(seg)) 
# 征战 四海 只 为 今日 一胜 , 我 不会 再败 了 。

使用命令进行分词

python -m jieba input.txt > output.txt

词性标注

# 词性标注包
import jieba.posseg as pseg
# 使用词性标注切词后返回的是单词和词性组成的元组
text = '安徽理工大学的大学生'
import jieba.posseg as pseg
for i in pseg.cut(text):
    print(i.word, '/', i.flag, end=' ')
# 安徽 / ns 理工大学 / nt 的 / uj 大学生 / n 

关键词抽取

# 基于TF-IDF算法的关键词提取
# jieba.analyse.extract_tags(sentence, topK=20, withWeight=False,allowPOS=())
# sentence:待提取的文本,topK:返回几个tf/idf权重最大的关键词,默认是20,allowPOS:仅包含指定词性的词,默认值为空,withWeight:是否一并返回关键词权重值,默认值为False。
import jieba.analyse
tags = jieba.analyse.extract_tags(text,topK=1)

# 基于TextRank
tags = jieba.analyse.textrank(text,topK=1)

# 关键词提取所使用的停用词文本语料库可以切换成自定义语料库的路径
# file_name为自定义语料库的路径
jieba.analyse.set_stop_words(file_name) 


# 更多内容请详见参考链接文章:倒数第一篇和第二篇

3-2-3、常见词性分类

名词
n 名词
nr 人名
nr1 汉语姓氏
nr2 汉语名字
nrj 日语人名
nrf 音译人名
ns 地名
nsf 音译地名
nt 机构团体名
nz 其它专名
nl 名词性惯用语
ng 名词性语素

时间词
t 时间词
tg 时间词性语素

处所词
s 处所词 (在公司,在学校)

方位词
f 方位词

动词
v 动词
vd 副动词
vn 名动词
vshi 动词“是”
vyou 动词“有”
vf 趋向动词
vx 形式动词
vi 不及物动词(内动词)
vl 动词性惯用语
vg 动词性语素

形容词
a 形容词
ad 副形词
an 名形词
ag 形容词性语素
al 形容词性惯用语

区别词
b 区别词
bl 区别词性惯用语

状态词
z 状态词

代词
r 代词
rr 人称代词
rz 指示代词
rzt 时间指示代词
rzs 处所指示代词
rzv 谓词性指示代词
ry 疑问代词
ryt 时间疑问代词
rys 处所疑问代词
ryv 谓词性疑问代词
rg 代词性语素

数词
m 数词
mq 数量词

量词
q 量词
qv 动量词
qt 时量词

副词
d 副词

介词
p 介词
pba 介词“把”
pbei 介词“被”

连词
c 连词
cc 并列连词

参考链接:
【Python+中文NLP】(二) 中文分词工具包:jieba.
中文分词工具—Jieba.
python jieba 中文分词工具包.
自然语言处理工具包jieba的使用.
基于python中jieba包的中文分词中详细使用(一).
基于python中jieba包的中文分词中详细使用(二).

四、常用的一些分词模型

利用统计机器学习模型学习模型学习词语的切分规律,从而实现对未知文本的切分,主要的一些统计机器学习模型有:N元文法模型(N-gram)、隐马尔可夫模型(HMM)、最大熵模型(ME),条件随机场模型(CRF)等。

4-1、朴素贝叶斯

4-2、N-gram模型

五、可视化工具

5-1、Seaborn

5-2、Word

六、文本特征提取

6-1、CountVectorizer

# 对于每一个训练文本,它只是考虑每种词汇在该训练文本出现的频率
# 它会将文本中的词语转换为词频矩阵,通过fit_transform函数来计算每个词语出现的次数。
# CountVectorizer是在sklearn的feature_extraction里
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
     'This is the first document.',
     'This document is the second document.',
     'And this is the third one.',
     'Is this the first document?',
]
vectorizer = CountVectorizer()

# fit: 根据CountVectorizer参数规则进行操作,比如说过滤停用词,拟合原始数据,生成文档中有价值的词汇表
# transform: 使用符合fit的词汇表或者是提供给构造函数的词汇表,从原始文本文档中提取词频,转换成词频矩阵。
# fit_transform: 拟合模型,并且返回一个文本矩阵。
X = vectorizer.fit_transform(corpus)
print(type(X))

# get_feature_names: 得到所有文本的词汇,是一个列表。
print(vectorizer.get_feature_names())
# ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

# vocabulary_: 所有文本组成的一个词汇表,是一个字典类型
print(vectorizer.vocabulary_)

# 返回停用词列表,默认的话是空的
print(vectorizer.stop_words_)

# toarray(): 将结果转化为稀疏矩阵的表达方式。
print(X.toarray())


其它:ContVectorizer的参数解释见参考链接第一篇文章。

6-2、TFidfVectorizer

# TF-IDF是一种统计方法,用于评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
# 字词的重要性会随着它在文件中出现的次数成正比增加,但是同时会随着它在语料库中出现的频率成反比下降。
# 某一个词对于文章的重要性越高,那么它的tf-idf的值就越大。
# TF:词频,表现词条在文本中出现的频率,被归一化,防止偏向长的文件。
# tf = 词条w在文档中出现的总次数/文档的词总数
# IDF:逆文件频率
# idf = log(文档总数/(包含该词的文档数+1)
# 某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
# 公式: TF*IDF

from sklearn.feature_extraction.text import TfidfVectorizer
train_document = ["The flowers are beautiful.",
                  "The name of these flowers is rose, they are very beautiful.",
                  "Rose is beautiful",
                  "Are you like these flowers?"]  
test_document = ["The flowers are mine.", 
                 "My flowers are beautiful"]               
 
#利用函数获取文档的TFIDF值
print("计算TF-IDF权重")       
transformer = TfidfVectorizer()
# fit(): 根据训练集生成词典和逆文档词频
# transform():使用fit学习的词汇和文档频率,将文档转化为文档-词矩阵,即对文本做向量化表示。
X_train = transformer.fit_transform(train_document)
X_test = transformer.transform(test_document)
 
#观察各个值
#(1)统计词列表
word_list = transformer.get_feature_names()  # 所有统计的词
print("统计词列表")
print(word_list)
 
#(2)统计词字典形式
print("统计词字典形式")
print(transformer.fit(test_document).vocabulary_)
 
#(3)TFIDF权重
weight_train = X_train.toarray()
weight_test = X_test.toarray()
print("train TFIDF权重")
print(weight_train)
print("test TFIDF权重")
print(weight_test)    
 
#(4)查看逆文档率(IDF)
print("train idf")
print(transformer.fit(train_document).idf_) 

# (5)查看生成的词语与列的对应关系,即词汇表,我们在fit的时候建立了一个词汇表。
print('词语与列的对应关系')
print(transformer.vocabulary_)

# (6)参数详解:
token_pattern:用来分词,使用正则表达式,注意,默认参数为r"(?u)\b\w\w+\b",该默认参数决定了其匹配至少长度为2的单词,如果想要匹配长度为1的单词,则只需要修改一下参数token_pattern=r"(?u)\b\w+\b")
stop_words:设置停用词表。
max_df/min_df:设置过滤值,过滤高于或低于该比例的词语。
max_feature: 设置使用多少词语,默认是都使用。

注意:在上边的代码中,第一次使用fit之后,根据训练集生成词典,这个词典里只是包含训练集的所有单词,下一步直接对测试集transform的话,使用的还是这个词典,但是测试集里有训练集没有的单词mine,即mine在用测试集生成的tf-idf权重里没有体现。

6-3、Keras.Embedding层

# 适合深度学习
# one-hot编码得到的向量是二进制的、稀疏的。
# 而词嵌入是低维的浮点数向量(密集向量)
# 从数据学习中得到,可以很好的反映词与词之间的关系。
import tensorflow as tf 
from tensorflow import keras
from keras.datasets import imdb
# 作为特征的单词个数为10000
max_features = 10000
# 评论长度限制为20个单词
maxlen = 20
(x_train, y_train),(x_test, y_test)=imdb.load_data(num_words=max_features)
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=maxlen)
x_test = keras.preprocessing.sequence.pad_sequences(x_test,maxlen=maxlen)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten,Dense,Embedding

model = Sequential()
# 指定Embedding层的最大输入长度,Embedding层的激活激活形状为(samples,maxlen, 8)
model.add(Embedding(10000, 8, input_length=maxlen))
# 将三维的嵌入张量展平成形状为(samples, maxlen*8)的二维张量。
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)

参考链接:
sklearn——CountVectorizer详解.
python 文本特征提取 CountVectorizer, TfidfVectorizer.
sklearn.feature_extraction.text 中的 TfidfVectorizer 实现过程.
fit_transform,fit,transform区别和作用详解!!!!!!.
【NLP】Python NLTK获取文本语料和词汇资源.
python机器学习——NLTK及分析文本数据(自然语言处理基础).
jieba分词详解.
Pandas数据分析②——数据清洗(重复值/缺失值/异常值).
sklearn-TfidfVectorizer彻底说清楚.


总结

以上就是全部内容啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ㄣ知冷煖★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值