数据集提取:
公众号:YOLO的学习进阶日常 然后回复:nlp1
本人 win10 python3.7 用的CPU
安装方式: pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple pip install --upgrade paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功如下:import paddle.fluid
paddle.fluid.install_check.run_check()
Running Verify Fluid Program ...
Your Paddle Fluid works well on SINGLE GPU or CPU.
Your Paddle Fluid works well on MUTIPLE GPU or CPU.
Your Paddle Fluid is installed successfully! Let's start deep Learning with Paddle Fluid now
使用jieba分词
“结巴”中文分词:做最好的 Python 中文分词组件
参考网站:https://github.com/fxsjy/jieba
import jieba
jieba.enable_paddle()
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(", ".join(seg_list))
Paddle enabled successfully......
2020-02-26 10:46:23,867-DEBUG: Paddle enabled successfully......
Building prefix dict from the default dictionary ...
2020-02-26 10:46:23,925-DEBUG: Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ASUS\AppData\Local\Temp\jieba.cache
2020-02-26 10:46:23,927-DEBUG: Loading model from cache C:\Users\ASUS\AppData\Local\Temp\jieba.cache
Paddle Mode: 我/来到/北京清华大学
Paddle Mode: 乒乓球/拍卖/完/了
Paddle Mode: 中国科学技术大学
Loading model cost 0.876 seconds.
2020-02-26 10:46:24,802-DEBUG: Loading model cost 0.876 seconds.
Prefix dict has been built successfully.
2020-02-26 10:46:24,803-DEBUG: Prefix dict has been built successfully.
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
基于 TF-IDF 算法的关键词抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) sentence 为待提取的文本 topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20 withWeight 为是否一并返回关键词权重值,默认值为 False allowPOS 仅包括指定词性的词,默认值为空,即不筛选 基于 TextRank 算法的关键词抽取 jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限公司 start: 6 end:10
词性标注
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
除了jieba默认分词模式,提供paddle模式下的词性标注功能。paddle模式采用延迟加载方式,通过enable_paddle()安装paddlepaddle-tiny,并且import相关代码;
import jieba
import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门") #jieba默认模式
jieba.enable_paddle()
words = pseg.cut("我爱北京天安门",use_paddle=True) #paddle模式
for word, flag in words:
print('%s %s' % (word, flag))
Paddle enabled successfully......
2020-02-26 10:48:16,044-DEBUG: Paddle enabled successfully......
我 r
爱 v
北京 LOC
天安门 LOC
延迟加载
jieba 采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。
import jieba
jieba.initialize() # 手动初始化(可选)
jieba.set_dictionary() #你可以改变主词典的路径:
实战:对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88
读取文件import os
import jieba
from collections import Counter
import math
filepath='D:\\AA\\C\\deepmind\\AI'
files=os.listdir(filepath)
s=''
for i in files:
file="D:\\AA\\C\\deepmind\\AI\\{}".format(i)
try:
with open(file,encoding='utf-8') as f:
iter_f = iter(f)
str = ""
for line in iter_f:
str = str + line
except:
with open(file,encoding='gbk') as f:
iter_f = iter(f)
str = ""
for line in iter_f:
str = str + line
s=s+str
正则表达式清洗,停用词处理,分词处理
因为这个数据有很多符号,所以这里先进行清理
然后进行停用词处理 最后再分词
def remove_punctuation(line):
if line.strip()=='':
return ''
rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")
line = rule.sub('',line)
return line
re_file=remove_punctuation(s)
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
return stopwords
stopwords = stopwordslist("D:\\AA\\C\\deepmind\\Data game\\nlp\\1 O2O food\\stopwords.txt")
re_file= " ".join([w for w in list(jb.cut(re_file)) if w not in stopwords])
new_list = re_file.split(" ")
from os import path
from wordcloud import WordCloud
import matplotlib.pyplot as plt
backgroud_Image = plt.imread('D:\\AA\\20180905112216706.png')
wc= WordCloud(background_color="white",
mask=backgroud_Image,
stopwords=stopwords,
font_path='C:\Windows\Fonts\STZHONGS.TTF')
wc.generate(re_file)
plt.figure(figsize=(6,6))
plt.imshow(wc,interpolation="bilinear")
plt.axis("off")
plt.show()
信息熵计算
信息熵个人理解就是,信息的混乱程度。信息是系统有序程度的一个度量,熵是系统无序程度的一个度量,从信息传播的角度来看,信息熵可以表示信息的价值;
如果指标的信息熵越大,该指标提供的信息量越大,在综合评价中所起作用理当越大,权重就应该越高。 举个例子:小朋友刚开始出生的时候只能说几句话,传播的信息量就很少,所以信息熵就很少;而成人之后,有的时候一句话都可以让你觉得接受了很多信息,因此信息量大,从而信息熵大。 信息熵最重要的就是理解概率分布的问题。 因此,可利用信息熵这个工具,计算出各个指标的权重,为多指标综合评价提供依据。其中,x表示随机变量,与之相对应的是所有可能输出的集合,定义为符号集,随机变量的输出用x表示。P(x)表示输出概率函数。
word_fre= Counter(new_list)
count= 0
for i in word_fre:
word_fre[i] /= len(new_list)
x= word_fre[i]
count+= x * math.log(x, 2)
count= -count
print("信息熵:", count)
信息熵: 12.619504395855172
思考一下:
假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
回答: