使用 jieba.cut(), jieba.lcut() 完成,后者返回 list 的结果,有三种分词模式:精确模式、全模式、搜索引擎模式。
jieba.cut(sentence,cut_all=False,HMM=True) # 精确模式
jieba.cut(sentence,cut_all=True,HMM=True) # 全模式
jieba.cut_for_search (sentence, HMM=True) # 搜索引擎模式
sentence为需要分词的字符串,可以是unicode 或 UTF-8字符串,GBK字符串可能解码错误;
cut_all 参数用来控制是否采用全模式,默认为False;
HMM 参数用来控制是否使用 HMM 模型。
import jieba
sentence="做人还是平常点好,争这个争那个,争来争去赔了自己的命。像我这样,说起来是越混越没出息,\
可寿命长,我认识的人一个挨着一个死去,我还活着。"
seg_list=jieba.cut(sentence,cut_all=False,HMM=True)
print("精确模式: " + "/ ".join(seg_list))
seg_list=jieba.cut(sentence,cut_all=True,HMM=True)
print("全模式: " + "/ ".join(seg_list))
seg_list=jieba.cut_for_search(sentence,HMM=True)
print("搜索引擎模式: " + "/ ".join(seg_list))
精确模式: 做人/ 还是/ 平常/ 点好/ ,/ 争/ 这个/ 争/ 那个/ ,/ 争来争/ 去/ 赔/ 了/ 自己/ 的/ 命/ 。/ 像/ 我/ 这样/ ,/ 说/ 起来/ 是/ 越/ 混越/ 没出息/ ,/ 可/ 寿命长/ ,/ 我/ 认识/ 的/ 人/ 一个/ 挨着/ 一个/ 死去/ ,/ 我/ 还/ 活着/ 。
全模式: 做人/ 还是/ 平常/ 点/ 好/ ,/ 争/ 这个/ 争/ 那个/ ,/ 争/ 来/ 争/ 去/ 赔/ 了/ 自己/ 的/ 命/ 。/ 像/ 我/ 这样/ ,/ 说起/ 起来/ 是/ 越/ 混/ 越/ 没出/ 没出息/ 出息/ ,/ 可/ 寿命/ 寿命长/ ,/ 我/ 认识/ 的/ 人/ 一个/ 挨着/ 一个/ 死去/ ,/ 我/ 还/ 活着/ 。
搜索引擎模式: 做人/ 还是/ 平常/ 点好/ ,/ 争/ 这个/ 争/ 那个/ ,/ 争来争/ 去/ 赔/ 了/ 自己/ 的/ 命/ 。/ 像/ 我/ 这样/ ,/ 说/ 起来/ 是/ 越/ 混越/ 没出/ 出息/ 没出息/ ,/ 可/ 寿命/ 寿命长/ ,/ 我/ 认识/ 的/ 人/ 一个/ 挨着/ 一个/ 死去/ ,/ 我/ 还/ 活着/ 。
容易发现,全模式会将所有可能的词都列举出来,一般都使用精确模式,搜索引擎模式适用于搜索引擎。
有两种方法:基于 TF-IDF 算法的关键词抽取和基于 TextRank 算法的关键词抽取。
jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=(),withFlag=False)
jieba.analyse.textrank(sentence,topK=20,withWeight=False,\
allowPOS=('ns','n','vn','v'),withFlag=False)
sentence 为待提取的文本;topK 为返回几个权重最大的关键词,默认值为 20;
withWeight 为是否一并返回关键词权重值,默认值为 False;
allowPOS 仅包括指定词性的词,TF-IDF 算法默认为空,不筛选,TextRank 算法默认过滤词性。
"ns", “n”, “vn”, “v”, “nr”,对应 地名、名词、动名词、动词、人名
extract_tags() 将频繁词作为关键词;textrank() 是利用局部词汇之间关系对后续关键词进行排序,其模型一般表示为一个有向有权图,计算过程中要迭代,较为耗时。
import jieba
import jieba.analyse
import pandas as pd
import numpy as np
with open("E:/数据/遮天.txt",'r',encoding='gb18030') as file:
read_txt_str = file.read()
print(read_txt_str[1:500])#看看开头
《遮天》
作者:辰东
内容简介:
冰冷与黑暗并存的宇宙深处,九具庞大的龙尸拉着一口青铜古棺,亘古长存。
这是太空探测器在枯寂的宇宙中捕捉到的一幅极其震撼的画面。
九龙拉棺,究竟是回到了上古,还是来到了星空的彼岸?
一个浩大的仙侠世界,光怪陆离,神秘无尽。热血似火山沸腾,激情若瀚海汹涌,欲望如深渊无止境……
登天路,踏歌行,弹指遮天。
第一章 星空中的青铜巨棺
第一章星空中的青铜巨棺
生命是世间最伟大的奇迹。
四方上下曰宇。宇虽有实,而无定处可求。往古来今曰宙。宙虽有增长,不知其始之所至。
浩瀚的宇宙,无垠的星空,许多科学家推测,地球可能是唯一的生命源地。
人类其实很孤独。在苍茫的天宇中,虽然有亿万星辰,但是却很难寻到第二颗生命源星。
不过人类从来没有放弃过探索,自上世纪以来已经发射诸多太空探测器。
旅行者二号是一艘无人外太空探测器,于一九七七年在美国肯尼迪航天中心发射升空。
它上面携带着一张主题为“向宇宙致意”的镀金唱片,里面包含一些流行音乐和用地球五十五种语言录制的问候辞,以冀
key_words=jieba.analyse.textrank(read_txt_str,topK=30,withWeight=True,\
allowPOS=('ns','n','nr'),withFlag=False)
key_words
[(‘叶凡’, 1.0),
(‘大帝’, 0.19875182422475243),
(‘全都’, 0.1647871696915421),
(‘金色’, 0.16261460615758888),
(‘浑身’, 0.1258051533840365),
(‘虚空’, 0.1222942662103232),
(‘天地’, 0.1172774027893979),
(‘圣体’, 0.11191268757303208),
(‘人族’, 0.10936859841357176),
(‘太古’, 0.10073543168889468),
(‘黄金’, 0.09657935199132323),
(‘宇宙’, 0.09510895178437348),
(‘圣人’, 0.09196317033532578),
(‘强者’, 0.08761885925802489),
(‘大圣’, 0.08741620998199477),
(‘修士’, 0.08720108323197902),
(‘所有人’, 0.07935019597200792),
(‘感觉’, 0.0782999955509707),
(‘消失’, 0.07809086722853642),
(‘众人’, 0.07558684111334052),
(‘大道’, 0.07404966789272857),
(‘庞博’, 0.07224869439336613),
(‘圣地’, 0.07022966128279133),
(‘人物’, 0.06935326090610788),
(‘星空’, 0.06850768497615349),
(‘老人’, 0.06599090352887194),
(‘身体’, 0.06576112980523321),
(‘黑色’, 0.06491506932351142),
(‘皇子’, 0.0640046540684788),
(‘上古’, 0.06376878590619371)]
通过提取关键词,我们知道了主角是叶凡,他是圣体,嗯哼,他浑身都是金色?!!大帝在文中有很重要的地位。与此同时,我们也知道啥叫水神,所以我们把“全都”、“众人”这样的词 过滤 掉吧。
jieba.analyse.set_stop_words('E:/数据/zhetian_stop_words.txt')
key_words=jieba.analyse.textrank(read_txt_str,topK=30,withWeight=True,\
allowPOS=('ns','n','nr'),withFlag=False)
key_words
[(‘叶凡’, 1.0),
(‘大帝’, 0.18265123784945667),
(‘金色’, 0.16614396014148466),
(‘虚空’, 0.12573012051951962),
(‘天地’, 0.12097392328252386),
(‘圣体’, 0.11544439799584695),
(‘人族’, 0.10926722210285106),
(‘太古’, 0.10299047591879995),
(‘黄金’, 0.09813527797099089),
(‘宇宙’, 0.0970837583561915),
(‘圣人’, 0.09328493982295358),
(‘大圣’, 0.08800840390530987),
(‘消失’, 0.07777137481059242),
(‘大道’, 0.07596795700095475),
(‘庞博’, 0.07321479685268986),
(‘圣地’, 0.0710613599262048),
(‘星空’, 0.06992468725266428),
(‘黑色’, 0.0671065230200573),
(‘皇子’, 0.0657436889849025),
(‘上古’, 0.06542040676095033),
(‘天庭’, 0.06421829894034374),
(‘荒古’, 0.06418197572612164),
(‘万物’, 0.06037997276321994),
(‘气息’, 0.057832651103026406),
(‘整片’, 0.057561209849332835),
(‘声音’, 0.05738735237879483),
(‘黑狗’, 0.056755132334208966),
(‘古老’, 0.056583208641763895),
(‘瑶池’, 0.05570310670883681),
(‘东荒’, 0.055697111872646574)]
现在的关键词里已经少了很多无用的字眼,我们能获得更多的信息了。
这里我就直接放之前的一个例子,这里只放关键代码,详细的这是个链接,你要找的内容很靠后
#region是我的DataFram类型的数据,name,summary,space,description是四个列的columns,因为我想把这
#四个列放一起分析,所以做了字符串的合并。如果仅取一列则为information=region['name'].astype(str)
information=(region['name']+region['summary']+\
region['space']+region['description']).astype(str)#有的列值可能不是str,通过astype(str)指定类型
#jieba分词
segments=[]#存放关键词
jieba.analyse.set_stop_words('E:/tianchi/stop_words.txt')
for row in information:#一行一行的取
if row is not None:#当前行不空的时候,对该行进行分词
word_list=jieba.analyse.extract_tags(row,allowPOS=('n','nr','ns'))
for word in word_list:
segments.append({'word':word,'count':1})#把该行的分词结果存放到最终结果里去
#通过按词汇分组,统计每个词出现的次数
pd_seg=pd.DataFrame(segments)
words=pd_seg.groupby(by='word',as_index=True)['count'].sum().sort_values(ascending=False)
words.head(25)
word
怀柔 88
小院 78
雁栖湖 78
民宿 76
长城 61
餐厅 55
厨房 53
青龙峡 52
大床 49
慕田峪长城 49
红螺寺 45
院子 42
景区 39
庭院 32
怀柔区 30
风景区 30
麻将机 29
榻榻米 27
客厅 26
山水 26
厨具 25
景观 24
聚会 24
原生态 23
山居 23