NLP4:结巴分词

38 篇文章 47 订阅
32 篇文章 9 订阅

一、实验内容

使用结巴分词工具进行分词、关键词提取与词性标注。

二、实验步骤

1.安装结巴分词

# from _future_ import unicode_literals # 将模块中显式出现的所有字符串转为unicode类型
# 从python2.6以后就用不过到了,已经内置到python内置了
import sys
sys.path.append("../")
import jieba
import jieba.posseg
import jieba.analyse

2. 读入文本文件中的内容,利用结巴分词的三种分词模式进行分词

报错:AttributeError: ‘NoneType’ object has no attribute ‘decode’
在这里插入图片描述
原因:提示有一个变量的值是None,None 的类型是NoneType , 它没有decode 方法。
解决:把txt[0]转为str形式

list1 = jieba.load_userdict("D:\Desktop\\1.txt")
print(list1)
None
txt = open("D:\Desktop\\1.txt",'r',encoding='utf-8').readlines()
list0 = txt[0]
print(list0)
list1 = str(txt[0])
list1
阳光包裹着奔跑,被予以光辉灿烂的自由。满堂花醉三千客,一剑霜寒十四州。阳光包裹着奔跑,被予以光辉灿烂的自由。请保持这一份热爱,奔赴下一场山海。





'阳光包裹着奔跑,被予以光辉灿烂的自由。满堂花醉三千客,一剑霜寒十四州。阳光包裹着奔跑,被予以光辉灿烂的自由。请保持这一份热爱,奔赴下一场山海。'

之后就可以跑通了。

① 精确模式

试图将句子最精确地切开,适合文本分析;

cut_all参数默认为False,所有使用cut方法时默认为精确模式

#精确模式
seg_list = jieba.cut(list1,cut_all=False) 
seg_list
print ("Default Mode:", "/ ".join(seg_list)) #精确模式
Default Mode: 阳光/ 包裹/ 着/ 奔跑/ ,/ 被/ 予以/ 光辉灿烂/ 的/ 自由

② 全模式

把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;

#全模式
seg_list = jieba.cut(list1,cut_all=True) 
print ("Full Mode:", "/ ".join(seg_list))
Full Mode: 阳光/ 包裹/ 着/ 奔跑/ ,/ 被/ 予以/ 光辉/ 光辉灿烂/ 灿烂/ 的/ 自由

③ 搜索引擎模式

在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

#搜索引擎模式
seg_list = jieba.cut_for_search(list1) 
print ("Search Mode:", ", ".join(seg_list))
Search Mode: 阳光, 包裹, 着, 奔跑, ,, 被, 予以, 光辉, 灿烂, 光辉灿烂, 的, 自由

3. 对上述文件中的词语进行词性标注

#词性标注
words = jieba.posseg.cut(list1)
for  word, flag in  words: 
    print('%s %s' % (word, flag))
阳光 nr
包裹 v
着 uz
奔跑 v
, x
被 p
予以 v
光辉灿烂 i
的 uj
自由 a
。 x
满堂 nr
花醉 nr
三千 m
客 n
, x
一剑 n
霜寒 n
十四 m
州 n
。 x
阳光 nr
包裹 v
着 uz
奔跑 v
, x
被 p
予以 v
光辉灿烂 i
的 uj
自由 a
。 x

4. 设置停用词表去掉前三的高频词,再次统计

在这里插入图片描述

# 统计上述文件中的前十个高频词汇
words = jieba.lcut(txt[0])
print("words:",words)
counts = {}
for word in words:
    if len(word) == 1: # 将标点符号不列入词频统计
        continue
    else:
        counts[word] = counts.get(word,0) + 1
print("count:",counts)
result=[]
result=sorted(counts.items(),key=lambda x:x[1],reverse=True)
print("result:",result)
print("top10 result:",result[:10])
words: ['阳光', '包裹', '着', '奔跑', ',', '被', '予以', '光辉灿烂', '的', '自由', '。', '满堂', '花醉', '三千', '客', ',', '一剑', '霜寒', '十四', '州', '。', '阳光', '包裹', '着', '奔跑', ',', '被', '予以', '光辉灿烂', '的', '自由', '。']
count: {'阳光': 2, '包裹': 2, '奔跑': 2, '予以': 2, '光辉灿烂': 2, '自由': 2, '满堂': 1, '花醉': 1, '三千': 1, '一剑': 1, '霜寒': 1, '十四': 1}
result: [('阳光', 2), ('包裹', 2), ('奔跑', 2), ('予以', 2), ('光辉灿烂', 2), ('自由', 2), ('满堂', 1), ('花醉', 1), ('三千', 1), ('一剑', 1), ('霜寒', 1), ('十四', 1)]
top10 result: [('阳光', 2), ('包裹', 2), ('奔跑', 2), ('予以', 2), ('光辉灿烂', 2), ('自由', 2), ('满堂', 1), ('花醉', 1), ('三千', 1), ('一剑', 1)]
# 方法二
tags = jieba.analyse.extract_tags(txt[0], topK=10)
print(",".join(tags))
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\15488\AppData\Local\Temp\jieba.cache
Loading model cost 0.754 seconds.
Prefix dict has been built successfully.


光辉灿烂,奔跑,包裹,予以,阳光,霜寒,花醉,自由,满堂,下一场
# 通过设置停用词表去掉前三的高频词,再次进行统计
jieba.analyse.set_stop_words("D:\Desktop\stopwords.txt")#加载停用词词表
tags = jieba.analyse.extract_tags(txt[0], topK=10)
print(",".join(tags))
光辉灿烂,予以,霜寒,花醉,自由,满堂,下一场,一剑,山海,奔赴

可以看到,“奔跑”,“包裹”,“阳光”三个词不见了

5. 对上述文件中的关键词进行提取,提取个数为15个。

# 对上述文件中的关键词进行提取,提取个数为15个
tags = jieba.analyse.extract_tags(txt[0], topK=15)
print(",".join(tags))
光辉灿烂,予以,霜寒,花醉,自由,满堂,下一场,一剑,山海,奔赴,热爱,三千,十四,一份,保持

6. 自定义词典

将文本:卓拉格奥尔吉,格里沙格里高里,热尼亚叶甫根尼
在精确模式下分词为:卓拉/格奥尔吉,格里沙/格里高里,热尼亚/叶甫根尼。
在这里插入图片描述

#精确模式
seg_list = jieba.cut(list1,cut_all=False) 
seg_list
print ("Default Mode:", "/ ".join(seg_list)) #精确模式
# 自定义词典
test_text = "卓拉格奥尔吉,格里沙格里高里,热尼亚叶甫根尼"
test_text1 = jieba.cut(test_text,cut_all=False)
print ("Default Mode:", "/ ".join(test_text1)) #精确模式
# 卓拉/格奥尔吉,格里沙/格里高里,热尼亚/叶甫根尼
jieba.load_userdict("D:\Desktop\jiebaDict.txt")
test_text2 = jieba.cut(test_text,cut_all=False)
print ("Self Mode:", "/ ".join(test_text2)) 
Default Mode: 卓拉/ 格奥尔/ 吉/ ,/ 格里沙/ 格里/ 高里/ ,/ 热尼亚/ 叶甫/ 根尼
Self Mode: 卓拉/ 格奥尔吉/ ,/ 格里沙/ 格里高里/ ,/ 热尼亚/ 叶甫根尼
#关键词提取

s = '''
此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册   资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。
目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。  '''

for  x, w in  jieba.analyse.extract_tags(s, topK=10, withWeight=False): 
    print('%s %s' % (x, w))

# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
欧 亚
吉 林
置 业
万 元
增 资



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-54-c9207878d691> in <module>
      5 目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。  '''
      6 
----> 7 for  x, w in  jieba.analyse.extract_tags(s, topK=10, withWeight=False):
      8     print('%s %s' % (x, w))
      9 


ValueError: too many values to unpack (expected 2)
#关键词提取

s = '''
此外,公司拟对全资子公司吉林欧亚置业有限公司增资4.3亿元,增资后,吉林欧亚置业注册   资本由7000万元增加到5亿元。吉林欧亚置业主要经营范围为房地产开发及百货零售等业务。
目前在建吉林欧亚城市商业综合体项目。2013年,实现营业收入0万元,实现净利润-139.13万元。  '''

for  x, w in  jieba.analyse.extract_tags(s, topK=20, withWeight=True): 
    print('%s %s' % (x, w))

# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
欧亚 0.7148056394033334
吉林 0.6453082221991667
置业 0.478531921956875
万元 0.33220407634875
增资 0.3288276861054167
4.3 0.24905765631041665
7000 0.24905765631041665
2013 0.24905765631041665
139.13 0.24905765631041665
实现 0.19486376152458332
综合体 0.19074469840854166
经营范围 0.18985803977479165
亿元 0.18745378397625
在建 0.17176428835750002
全资 0.16822244884583334
百货 0.163858254571875
注册 0.15190267518354167
零售 0.14443267604520835
子公司 0.14291960962
营业 0.13630174790083333
#textrank
for  x, w in  jieba.analyse.textrank(s, withWeight=True): 
    print('%s %s' % (x, w))

# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示过滤所有,与TF—IDF不一样!
欧亚 1.0
吉林 0.9364641330019609
置业 0.6432179048068093
实现 0.585402153793541
收入 0.43240063293299474
增资 0.4058272733028047
子公司 0.35273363353936127
城市 0.3492725633507077
商业 0.3476243659188807
在建 0.3200580083086885
零售 0.30288826958119686
百货 0.3021737387349968
全资 0.2993380759226258
营业 0.29926807751968304
注册 0.29865040909098856
综合体 0.292992290385712
开发 0.28202080738141794
业务 0.2793133445548325
有限公司 0.27682069669610626
经营范围 0.2651294160502385
#加载停用词词表
jieba.analyse.set_stop_words('stopwords.txt')

for  x, w in  jieba.analyse.textrank(s, withWeight=True): 
    print('%s %s' % (x, w))
    
# 创建停用词list
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords


欧亚 1.0
吉林 0.9364641330019609
置业 0.6432179048068093
实现 0.585402153793541
收入 0.43240063293299474
增资 0.4058272733028047
子公司 0.35273363353936127
城市 0.3492725633507077
商业 0.3476243659188807
在建 0.3200580083086885
零售 0.30288826958119686
百货 0.3021737387349968
全资 0.2993380759226258
营业 0.29926807751968304
注册 0.29865040909098856
综合体 0.292992290385712
开发 0.28202080738141794
业务 0.2793133445548325
有限公司 0.27682069669610626
经营范围 0.2651294160502385

其他:实验四:结巴分词

实验内容

本实验旨在使用结巴分词库对文本进行分词,并进行一系列文本处理操作,包括词性标注、停用词过滤、关键词提取以及自定义词典的应用。

实验步骤

步骤一:安装结巴分词

首先,你需要安装结巴分词库。你可以使用pip进行安装:

pip install jieba

步骤二:读入文本文件

在Python中,你可以使用open函数读入文本文件的内容,然后对文本进行处理。以下是一个示例:

with open('your_text_file.txt', 'r', encoding='utf-8') as file:
    text = file.read()

步骤三:分词操作

结巴分词库提供了三种分词模式:精确模式、全模式和搜索引擎模式。你可以按如下方式使用它们:

import jieba

# 精确模式
seg_exact = jieba.cut(text, cut_all=False)

# 全模式
seg_full = jieba.cut(text, cut_all=True)

# 搜索引擎模式
seg_search = jieba.cut_for_search(text)

步骤四:词性标注

你可以使用结巴分词库的词性标注功能来标注每个词的词性。以下是示例代码:

import jieba.posseg as pseg

words = pseg.cut(text)
for word, flag in words:
    print(f'{word}\t{flag}')

步骤五:停用词过滤与高频词统计

可以创建一个停用词表,将文本中的高频词(通常是虚词、无实际语义的词)去掉,以提高文本的质量。你可以使用Python的collections库来进行高频词统计。

步骤六:关键词提取

使用结巴分词库的jieba.analyse模块,可以轻松提取文本中的关键词。以下是示例代码:

from jieba import analyse

# 提取15个关键词
keywords = analyse.extract_tags(text, topK=15)
print(keywords)

步骤七:自定义词典

结巴分词库支持自定义词典,你可以添加自己的专业词汇或特定领域的词语,以提高分词准确性。自定义词典的格式为每行一个词语。

jieba.load_userdict('your_custom_dict.txt')

请根据实际需要进行适当的修改和扩展,这些步骤将帮助你利用结巴分词库进行文本处理和分析。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
结巴分词早期版本。 * 结巴分词(java版) jieba-analysis 首先感谢jieba分词原作者[[https://github.com/fxsjy][fxsjy]],没有他的无私贡献,我们也不会结识到结巴 分词,更不会有现在的java版本。 结巴分词的原始版本为python编写,目前该项目在github上的关注量为170, 打星727次(最新的数据以原仓库为准),Fork238次,可以说已经有一定的用户群。 结巴分词(java版)只保留的原项目针对搜索引擎分词的功能(cut_for_index、cut_for_search),词性标注,关键词提取没有实现(今后如用到,可以考虑实现)。 * 简介 ** 支持分词模式 - Search模式,用于对用户查询词分词 - Index模式,用于对索引文档分词 ** 特性 - 支持多种分词模式 - 全角统一转成半角 - 用户词典功能 - conf 目录有整理的搜狗细胞词库 - 支持词性标注(感谢 [[https://github.com/linkerlin][@linkerlin]] 的贡献) * 如何获取 - 当前稳定版本 #+BEGIN_SRC xml com.huaban jieba-analysis 0.0.2 #+END_SRC - 当前快照版本 - 支持词性标注 [[https://github.com/huaban/jieba-analysis/pull/4][#4]] - 修复以'-'连接词分词错误问题 [[https://github.com/huaban/jieba-analysis/issues/3][#3]] #+BEGIN_SRC xml com.huaban jieba-analysis 1.0.0-SNAPSHOT #+END_SRC * 如何使用 - Demo #+BEGIN_SRC java @Test public void testDemo() { JiebaSegmenter segmenter = new JiebaSegmenter(); String[] sentences = new String[] {"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。", "我不喜欢日本和服。", "雷猴回归人间。", "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作", "结果婚的和尚未结过婚的"}; for (String sentence : sentences) { System.out.println(segmenter.process(sentence, SegMode.INDEX).toString()); } } #+END_SRC * 算法(wiki补充...) - [ ] 基于 =trie= 树结构实现高效词图扫描 - [ ] 生成所有切词可能的有向无环图 =DAG= - [ ] 采用动态规划算法计算最佳切词组合 - [ ] 基于 =HMM= 模型,采用 =Viterbi= (维特比)算法实现未登录词识别 * 性能评估 - 测试机配置 #+BEGIN_SRC screen Processor 2 Intel(R) Pentium(R) CPU G620 @ 2.60GHz Memory:8GB 分词测试时机器开了许多应用(eclipse、emacs、chrome...),可能 会影响到测试速度 #+END_SRC - [[src/test/resources/test.txt][测试文本]] - 测试结果(单线程,对测试文本逐行分词,并循环调用上万次) #+BEGIN_SRC screen 循环调用一万次 第一次测试结果: time elapsed:12373, rate:2486.986533kb/s, words:917319.94/s 第二次测试结果: time elapsed:12284, rate:2505.005241kb/s, words:923966.10/s 第三次测试结果: time elapsed:12336, rate:2494.445880kb/s, words:920071.30/s 循环调用2万次 第一次测试结果: time elapsed:22237, rate:2767.593144kb/s, words:1020821.12/s 第二次测试结果: time elapsed:22435, rate:2743.167762kb/s, words:1011811.87/s 第三次测试结果: time elapsed:22102, rate:2784.497726kb/s, words:1027056.34/s 统计结果:词典加载时间1.8s左右,分词效率每秒2Mb多,近100万词。 2 Processor Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz 12G 测试效果 time elapsed:19597, rate:3140.428063kb/s, words:1158340.52/s time elapsed:20122, rate:3058.491639kb/s, words:1128118.44/s #+END_SRC

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是Yu欸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值