分词效果尝试
接下来我将体验NLPIR和jieba分词的效果,其中,NLPIR使用在线演示,jieba由于其体验网站出错故使用代码。
(1)NLPIR
进入在线演示系统,输入网址抓取后可以在方框内得到相应文字,这里我们以公共管理学院的新闻——认真贯彻落实十九大精神 我院积极开展调研工作为例展开分词体验。(这里抓取的是网页内的所有文本,即包括导航栏文本和底部信息等,我手动将那些删掉了,留下了新闻主体)输入网址后点击开始分析。
网页采集.png
-
分词标注:
分词标注.png
对文本进行分词,并将出现的字词进行词性标注(如名词、形容词、动词等)
-
实体抽取:
实体抽取.png识别出文本中出现的专有名称和有意义的数量短语并进行分类,主要包括实体(组织名,人名,地名)、时间表达式(日期、时间)和数字表达式(货币值、百分数等)
-
词频统计:
词频统计.png
分词后将每类词性下出现的词语进行频数统计
-
文本分类:
文本分类.png
根据文本中截取到的词语进行分析,得出该文本描述的内容的类别
-
情感分析:
情感分析(SA)又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等。
情感分析.png情感极性分析的目的是对文本进行褒义、贬义、中性的进行判断。
-
关键词提取:
关键词提取.png
根据对文本中提取到的词语的统计得出的一些使用次数较多的关键词,并根据出现次数的多少决定字号大小,方便抓取重要词汇
(有一点不明白的是每刷新一次这个图就会变一次) -
Word2vec:
也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。
(虽然这么说了但是我也还是不是很能理解,有兴趣的童鞋可以自行查找一下相关资料。比如说我就不是很明白为什么这里会出现清华大学,不过我猜测可能是NLPIR自己进行分词统计后得出的和本篇文本相关的词汇)
Word2vec.png
- 依存文法:
依存文法.png通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系
-
地图可视化:
将文本中涉及到的位置显示到地图上
地图可视化.png -
敏感词:
这个的含义没有查到,我猜测大概是针对文本中可能存在的敏感词进行检测
敏感词.png -
摘要提取:
对文本内容的精简提炼
摘要提取.png
以上即为本次使用NLPIR分词的过程。
(2)jieba分词
关于jieba的使用,我是在云服务器上完成的,而我们的云服务器已经由另一个组员安装好了jieba,所以我这里也不赘述安装过程,想知道的同学可以自己看看,也不是很复杂。
以下代码参考jieba在GitHub上的demo和学习使用Jieba。
我先在本地电脑上新建了一个jieba_test.txt文件(内容同上面的新闻一样),然后通过Xftp上传到云服务器的/jieba文件夹中。
命令行分词
输入命令:(要注意当前是否处在txt文件所在目录下)
python -m jieba jieba_test.txt
结果如下:
命令行分词.png
可以看到,文本中的“十九大”被切分成了“十九”和“大”;“图情档”被切分成“图情”和“档”;“公共管理大类”被切分成了“公共”、“管理”、“大”和“类”;“史云贵”(院长名)被切分成了“史”和“云贵”。这些问题来源于这些词并不存在于jieba的词典中,而且其出现频率的大小也会造成影响,比如“十九”出现的频率会高于“十九大”的频率,所以会导致在分词时会被切分成两部分。
通过文件代码分词并添加词典
接下来添加并引用自定义词典收录上述词语:
添加用户自定义词典:
用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
我添加的词典如下图所示:
self_dict.txt.png
代码如下:(dict.py)
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import jieba
#读取txt文档内容
file_object = open('jieba_test.txt')
file_content = file_object.read()
file_object.close()
jieba.load_userdict("self_dict.txt") #引用用户的自定义词典
words = jieba.cut(file_content) #对内容进行分词
print('/'.join(words)) #输出分词结果
上传后使用./dict.py运行,报错如下图:
没有权限.png
此时可通过代码:
chmod 755 ./dict.py
来修改权限。修改成功后文件名会变成绿色,如下图所示:
纠正错误1.png
完毕后运行时又遇到另一报错:
不同系统的编码格式转换错误.png
修改方法为:
[wenny673@VM_0_8_centos jieba]$ vi dict.py
:set ff=unix
:x
保存退出后若是不放心可以再执行一遍vi dict.py然后输入:set ff查看,:set ff=unix时即为成功。
(纠错方法参考终端直接执行py文件,不需要python命令和python报/usr/bin/python^M: bad interpreter: No such file or directory)
再次执行dict.py文件,成功运行并得到下图结果:
可以看到此时“十九大”、“公共管理大类”和“史云贵”三个词已经不会再被切分了。
另一种方式为直接在程序里进行分词调整:
使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
代码如下:
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import jieba
file_object = open('jieba_test.txt')
file_content = file_object.read()
file_object.close()
jieba.add_word('十九大') #通过add_word在程序中动态修改词典
jieba.add_word('公共管理大类')
jieba.del_word('史云贵')
words=jieba.cut(file_content)
print("/".join(words))
此时也可以获得和上图相同的结果
提取关键词
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
代码参考基于TF-IDF的关键词提取和学习使用Jieba。
代码如下:
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
content = open('jieba_test.txt', 'rb').read()
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
提取结果为:
关键词提取结果1.png
另一种提取方式:(test.py)
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import sys
sys.path.append('../')
import jieba
import jieba.analyse
from optparse import OptionParser
USAGE = "usage: python test.py [file name] -k [top k]"
parser = OptionParser(USAGE)
parser.add_option("-k", dest="topK")
opt, args = parser.parse_args()
if len(args) < 1:
print(USAGE)
sys.exit(1)
file_name = args[0]
if opt.topK is None:
topK = 10
else:
topK = int(opt.topK)
content = open(file_name, 'rb').read()
tags = jieba.analyse.extract_tags(content, topK=topK)
print(",".join(tags))
此时在命令行输入
python test.py jieba_test.txt -k 15
可得结果如下:
基于 TextRank 算法的关键词抽取将
tags = jieba.analyse.extract_tags(content, topK=topK)
换为
tags=jieba.analyse.textrank(content,topK=topK)
即可。
在命令行输入
python test.py jieba_test.txt -k 15
结果为:
关键词提取结果3.png
词云生成
代码来自学习使用Jieba,参照Python + wordcloud + jieba 十分钟学会用任意中文文本生成词云稍作改动。
绘制词云图要用到matplotlib包,请先确保自己的python里已经安装好了这个(我在这里栽了好久)。主要安装方法为
pip install matplotlib
运气好的一般一次就能成功了,但是像我这种比较惨的就是依赖缺了一个又一个(其实就两个),分别是bz2和tkinter,解决方法见python: ImportError: No module named bz2、python解决 ModuleNotFoundError: No module named '_bz2'和【求助】centos7上安装Python3缺失tkinter
运行generate.py时会出现报错如下:
_tkinter.TclError: no display name and no $DISPLAY environment variable
这时候只要在代码的起始处添加
import matplotlib
matplotlib.use('Agg')
就ok了。下面是generate_wc.py的详细代码:
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import os
from os import path
import matplotlib
# Force matplotlib to not use any Xwindows backend.
matplotlib.use('Agg')
import jieba
import jieba.analyse
from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import random
d = path.dirname('.') # 获取当前文件路径
def load_data(file_path):
'''
输入文件路径,返回文件内容
'''
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
except Exception as e:
print("something wrong in load_data()")
return content
#获取背景图片
def load_image(file_path):
image = Image.open(file_path)
graph = np.array(image)
return graph
def generate_wordcloud(content, graph):
result = jieba.analyse.textrank(content, topK=50, withWeight=True)
keywords = dict()
for i in result:
keywords[i[0]] = random.randint(1, 10)
wc = WordCloud(font_path='caoshu.ttf', #设置字体
background_color='White', # 背景颜色
max_words=50, # 词云显示的最大词数
mask=graph)
wc.generate_from_frequencies(keywords) #生成词云
image_color = ImageColorGenerator(graph) # 从背景图片生成颜色值
#显示图片
plt.imshow(wc)
plt.imshow(wc.recolor(color_func=image_color))
plt.axis("off")
plt.show()
#生成图片文件
wc.to_file(path.join(d, "ciyun.png"))
if __name__ == '__main__':
data_file = input('Please enter a data file path:')
content = load_data(data_file)
image_file = input('Please enter a image file path:')
graph = load_image(image_file)
generate_wordcloud(content, graph)
背景图:
dq.jpg
生成的词云图如下:(我用的是草书所以飘逸了点)
ciyun.png
以上即为本次jieba分词体验的全部内容。
网友评论