jieba结巴分词器 约定不等于承诺〃 2022-02-23 13:12 297阅读 0赞 **安装:** pip install jieba **相关知识:** **三种分词模式:** 1. 全模式 :把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。这种全模式,会根据字典,将所有出现的字词全部匹配划分,所以会出现重复,这不是我们需要的。 2.精确模式 :试图将句子最精确地切开,适合文本分析(类似LTP分词方式),这种精确模式就比较接近我们想要的了。 3.搜索引擎模式:在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词。这种搜索引擎模式也不错,更加细化了。 **载入自定义词典:** 开发者可以自定义词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。 **用法:** jieba.load\_userdict(file\_name) 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词、数字(代表词频,越大越容易匹配到,但不要过大,可省略)、字母(代表词性,可省略),用空格隔开,顺序不可颠倒。file\_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。 词频省略时使用自动计算,能保证分出该词的词频。 **词性表:** <table> <thead> <tr> <th>词性</th> <th>表示符号</th> </tr> </thead> <tbody> <tr> <td>形容词</td> <td>a 形容词;ad 副形词;an 名形词;ag 形容词性语素;al 形容词性惯用语</td> </tr> <tr> <td>区别词</td> <td>b 区别词;bl 区别词性惯用语</td> </tr> <tr> <td>连词</td> <td>c 连词;cc 并列连词</td> </tr> <tr> <td>副词</td> <td>d 副词</td> </tr> <tr> <td>叹词</td> <td>e 叹词</td> </tr> <tr> <td>方位词</td> <td>f 方位词</td> </tr> <tr> <td>前缀</td> <td>h 前缀</td> </tr> <tr> <td>后缀</td> <td>k 后缀</td> </tr> <tr> <td>数词</td> <td>m 数词;mq 数量词</td> </tr> <tr> <td>名词</td> <td>n 名词;nr 人名;nr1 汉语姓氏;nr2 汉语名字;nrj 日语人名;nrf 音译人名;ns 地名;nsf 音译地名;nt 机构团体名;nz 其它专名;nl 名词性惯用语;ng 名词性语素</td> </tr> <tr> <td>拟声词</td> <td>o 拟声词</td> </tr> <tr> <td>介词</td> <td>p 介词;pba 介词“把”;pbei 介词“被”</td> </tr> <tr> <td>量词</td> <td>q 量词;qv 动量词;qt 时量词</td> </tr> <tr> <td>代词</td> <td>r 代词;rr 人称代词;rz 指示代词;rzt 时间指示代词;rzs 处所指示代词;rzv 谓词性指示代词;ry 疑问代词;ryt 时间疑问代词;rys 处所疑问代词;ryv 谓词性疑问代词;rg 代词性语素</td> </tr> <tr> <td>处所词</td> <td>s 处所词</td> </tr> <tr> <td>时间词</td> <td>t 时间词;tg 时间词性语素</td> </tr> <tr> <td>助词</td> <td>u 助词;uzhe 着;ule 了 喽;uguo 过;ude1 的 底;ude2 地;ude3 得;usuo 所;udeng 等 等等 云云;uyy 一样 一般 似的 般;udh 的话;uls 来讲 来说 而言 说来;uzhi 之;ulian 连 (“连小学生都会”)</td> </tr> <tr> <td>动词</td> <td>v 动词;vd 副动词;vn 名动词;vshi 动词“是”;vyou 动词“有”;vf 趋向动词;vx 形式动词;vi 不及物动词(内动词);vl 动词性惯用语;vg 动词性语素</td> </tr> <tr> <td>标点符号</td> <td>w 标点符号;wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { < wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >;wyz 左引号,全角:“ ‘ 『;wyy 右引号,全角:” ’ 』;wj 句号,全角:。;ww 问号,全角:? 半角:?;wt 叹号,全角:! 半角:!;wd 逗号,全角:, 半角:,;wf 分号,全角:; 半角: ;;wn 顿号,全角:、;wm 冒号,全角:: 半角: :;ws 省略号,全角:…… …;wp 破折号,全角:—— -- ——- 半角:— ----;wb 百分号千分号,全角:% ‰ 半角:%;wh 单位符号,全角:¥ $ £ ° ℃ 半角:$</td> </tr> <tr> <td>字符串</td> <td>x 字符串;xx 非语素字;xu 网址URL</td> </tr> <tr> <td>语气词</td> <td>y 语气词(delete yg)</td> </tr> <tr> <td>状态词</td> <td>z 状态词</td> </tr> </tbody> </table> **调整词典:** 1、使用 add\_word(word, freq=None, tag=None) 和 del\_word(word) 可在程序中动态修改词典。 2、使用 suggest\_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。 **例1:** import jieba sent = '天善智能是一个专注于商业智能BI、数据分析、数据挖掘和大数据技术领域的技术社区 www.hellobi.com 。内容从最初的商业智能 BI 领域也扩充到了数据分析、数据挖掘和大数据相关 的技术领域,包括 R、Python、SPSS、Hadoop、Spark、Hive、Kylin等,成为一个专注于数据领域的垂直社区。天善智能致力于构建一个基于数据领域的生态圈,通过社区链接一切 与数据相关的资源:例如数据本身、人、数据方案供应商和企业,与大家一起共同努力推动大数据、商业智能BI在国内的普及和发展。' #全模式 wordlist = jieba.cut(sent, cut_all = True) print('|'.join(wordlist)) \#结果为: 天|善|智能|是|一个|专注|于|商业|商业智能|智能|BI||数据|数据分析|分析|||数据|数据挖掘|挖掘|和|大数|数据|技术|领域|的|技术|技术社|社区||www|hellobi|com|||内容|从|最初|的|商业|商业智能|智能||BI||领域|也|扩充|充到|了|数据|数据分析|分析|||数据|数据挖掘|挖掘|和|大数|数据|相关|||的|技术|领域|||包括||R|Python|SPSS|Hadoop|Spark|Hive|Kylin|等|||成为|一个|专注|于|数据|领域|的|垂直|社区|||天|善|智能|致力|致力于|构建|一个|基于|数据|领域|的|生态|生态圈|||通过|社区|链接|一切|||与|数据|相关|的|资源|||例如|如数|数据|本身|||人|||数据|方案|供应|供应商|和|企业|||与|大家|一起|共同|共同努力|努力|力推|推动|大数|数据|||商业|商业智能|智能|BI|在|国内|的|普及|和|发展|| #精确模式 wordlist2 = jieba.cut(sent) print('|'.join(wordlist2)) \#结果为: 天善|智能|是|一个|专注|于|商业智能|BI|、|数据分析|、|数据挖掘|和|大|数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业智能| |BI| |领域|也|扩充|到|了|数据分析|、|数据挖掘|和|大|数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善|智能|致力于|构建|一个|基于|数据|领域|的|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应商|和|企业|,|与|大家|一起|共同努力|推动|大|数据|、|商业智能|BI|在|国内|的|普及|和|发展|。 #搜索引擎模式 wordlist3 = jieba.cut_for_search(sent) print('|'.join(wordlist3)) \#结果为 天善|智能|是|一个|专注|于|商业|智能|商业智能|BI|、|数据|分析|数据分析|、|数据|挖掘|数据挖掘|和|大|数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业|智能|商业智能| |BI| |领域|也|扩充|到|了|数据|分析|数据分析|、|数据|挖掘|数据挖掘|和|大|数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善|智能|致力|致力于|构建|一个|基于|数据|领域|的|生态|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应|供应商|和|企业|,|与|大家|一起|共同|努力|共同努力|推动|大|数据|、|商业|智能|商业智能|BI|在|国内|的|普及|和|发展|。 **发现新问题–增加用户自定义词典:** 回看精确模式的结果,发现有些新词汇或者专业词汇,例如:天善智能、大数据,这些不应该再被切分,所以在默认词典的基础上,可以加载自定义的词典。 #使用自定义字典 jieba.load_userdict('c:/ProgramData/Anaconda3/Lib/site-packages/jieba/mydict.txt') Wordlist4 = jieba.cut(sent) print('|'.join(wordlist4)) \#结果为 天善智能|是|一个|专注|于|商业智能|BI|、|数据分析|、|数据挖掘|和|大数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业智能| |BI| |领域|也|扩充|到|了|数据分析|、|数据挖掘|和|大数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善智能|致力于|构建|一个|基于|数据|领域|的|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应商|和|企业|,|与|大家|一起|共同努力|推动|大数据|、|商业智能|BI|在|国内|的|普及|和|发展|。 **例2:** #!/usr/bin/env python # -*-coding=utf-8-*- """ 为保证数据准确性需进行以下操作(注意按照以下顺序): 1、汉字繁简体统一 2、字母大小写统一 3、准确分词(注意'3d max'带空格或特殊符号的单词) 4、同义词替换 5、去除停用词 6、去除每条数据中的重复分词 7、去除多余标点符号 """ import pandas as pd import jieba import re from langconv import * #汉字繁简体转换,需下载langconv.py和zh_wiki.py文件,并将其放在与代码同一目录下 from tongyici import * #引用自定义同义词字典,tongyici.py需与代码在同一目录下 from collections import Counter #collections模块提供了一些有用的集合类,Counter是一个简单的计数器 # 转换繁体到简体 def fan_to_jian(line): line = Converter('zh-hans').convert(line) line.encode('utf-8') return line # 添加自定义分词 def add_word(list): for i in list: jieba.add_word(i) # 删除自定义分词 def del_word(list): for i in list: jieba.del_word(i) # 用jieba对商品名称进行文本分析 add_ci = ['3d max', 'altium designer', 'mac os', 'spring boot', 'android studio', 'deep learning ai', 'machine learning', 'visual c++', 'visual studio', 'cloud docker', 'atey ghalian', 'john park'] del_ci = ['视频教程', '自学教材'] add_word(add_ci) del_word(del_ci) #或jieba.add_word('视频教程', 0)动态修改词典,使之分成视频和教程2个词 jieba.re_han_default = re.compile('(.+)', re.U) #用于解决中间带空格或其他特殊符号的单词分成多个词的问题 jieba.load_userdict('c:/ProgramData/Anaconda3/Lib/site-packages/jieba/mydict.txt') #导入自定义字典 file = pd.read_excel(r'c:\users\administrator\desktop\商品信息v2.0版.xlsx') #读取本地文件 title = list(file['商品名称']) #商品名称转化成list title_s = [] #商品名称分词list for line in title: text = fan_to_jian(line).lower()#将繁体字转换成简体字并将大写字母转换成小写 title_cut = jieba.lcut(text) #分词成list,lcut()函数返回list #替换同义词 new_cut = [] #替换同义词后的新数据 for fenci in title_cut: #替换同义词 if fenci in dian: #判断是否在字典中 val = dian[fenci] #获取同义词的统一词 new_cut.append(val) else: new_cut.append(fenci) title_s.append(new_cut) # print(title_s) #导入停用词 stopwords = ['教程'] #停用词list,可将停用词表中没有的先加入进去 for line in open(r'e:/Python/mypy/stopwords/中英文.txt', 'r+', encoding='utf-8'): stopwords.append(line.strip())#将停用词字典内容写入停用词list中备用 #剔除商品名称分词中的停用词 title_clear = [] #剔除停用词后的商品名称分词 for line in title_s: line_clear = [] #每个商品剔除停用词后的商品名称分词 for word in line: if word not in stopwords and word.strip(): #判断分词不在停用词字典中,并且不为空 line_clear.append(word.strip()) #去除词两侧的空格 title_clear.append(line_clear) # print(title_clear) #去除每个商品名称中的重复分词,提高准确率 title_clear2 = [] for line in title_clear: line_clear2 = [] for word in line: if word not in line_clear2: line_clear2.append(word.strip()) title_clear2.append(line_clear2) # print(title_clear2) # 去除标点符号后将所有商品名称分词放入同一个list中 allwords = [] r = "[^0-9A-Za-z\u4e00-\u9fa5]" #非数字、字母和汉字 for line in title_clear2: for word in line: ci = re.sub(r, '', word).strip() #去除标点符号 if ci: #ci若为空则原word为标点符号,如果ci不为空,则进行下步 allwords.append(ci) # print(allwords) #把allwords列表转为DataFrame数据,类似表格 df_allwords = pd.DataFrame({'allwords':allwords}) #前面一个allwords为columns列的名称 # print(df_allwords) #对过滤去重的词汇进行分类汇总 #value_counts()的作用是统计表格某列有多少不同值,并计算每个不同值在该列中有多少重复值,需要指定对哪一列或行使用。 #reset_index()的作用是重新设置DataFrame的连续行索引index。 word_count = df_allwords.allwords.value_counts().reset_index() # print(word_count) word_count.columns = ['word', 'count'] #重命名列的名称 print(word_count) # 获取所有分词及出现次数(按出现次数降序排列),需引用from collections import Counter c = Counter(allwords).most_common() #most_common(200)获取出现频率前200的分词及出现次数 # print(c) **常见问题:** 1、jieba自带字典无法分开词的处理方法,如(‘视频教程’、‘javaweb’): 自带字典中有‘视频’、‘教程’和‘视频教程’时,可在程序中动态临时删除‘视频教程’,从而达到分开‘视频教程’的目的,如下: jieba.del_word('视频教程') #或jieba.add_word('视频教程', 0)动态修改词典,使之分成视频和教程2个词 jieba.suggest_freq('视频教程', True) #suggest_freq()不能分解 自带字典中没有‘java’、‘web’和‘javaweb’时,可在程序中动态临时添加‘java’和‘web’,从而达到分开‘javaweb’的目的(建议在自定义字典中添加java和web,以便下次使用),如下: jieba.add_word('java', 3, 'n') jieba.add_word('web', 3, 'n') #自带字典无java、web和javaweb,此2行可使javaweb分成java和web两个词,也可在自定义字典中添加java和web 2、中间带空格或其他特殊符号的单词分成多个词的问题: #代码中添加以下2行即可 jieba.add_word('3D max', 3, 'n') jieba.re_han_default = re.compile('(.+)', re.U) #此2行用于解决中间带空格的单词分成多个词的问题 如果以上方法仍不行,则可尝试以下方法: 可以通过修改jieba的init.py文件中的几个正则表达式来解决这个问题。用户词典中词性用@@分隔。 1. 搜索 re_han_default = re.compile(“([\u4E00-\u9FD5a-zA-Z0-9+#&._]+)”, re.U) 改成 re_han_default = re.compile(“(.+)”, re.U) 2. 搜索 re_userdict = re.compile(‘^(.+?)( [0-9]+)?( [a-z]+)?$’, re.U) 改成 re_userdict = re.compile(‘^(.+?)(\u0040\u0040[0-9]+)?(\u0040\u0040[a-z]+)?$’, re.U) 3. 搜索 word, freq = line.split(’ ‘)[:2] 改成 word, freq = line.split(‘\u0040\u0040’)[:2] 4. 补充:若用全模式则继续改。 搜索 re_han_cut_all = re.compile(“([\u4E00-\u9FD5]+)”, re.U) 改成 re_han_cut_all = re.compile(“(.+)”, re.U)
还没有评论,来说两句吧...