笔记来自课程:玩转文本挖掘(51ct0学院),总结整理为个人学习、复习使用,供参考。
分词思想和工具也有很多,这里先只学习jeiba分词。
jieba分词
三种分词模式
- 精确模式:试图将句子最精确分开,适合做文本分析(默认精确模式)
- 全模式:把句子中所有可以成词的词语扫描出来,速度快,但不能解决歧义
- 搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词(考虑了搜索引擎的需求,主要是为了提高搜索引擎的命中率)
另外,也支持繁体分词和自定义词典
基本使用
import jieba
import warnings
warnings.filterwarnings('ignore')
tmpstr='郭靖和哀牢山三十六剑,'
res=jieba.cut(tmpstr) #默认精确模式
print(res)
#是一个可迭代的generator,可用for循环遍历结果,类似与list
print('/'.join(res))
郭靖/和/哀牢山/三十六/剑/,
<generator object Tokenizer.cut at 0x000000000B5758C8>
分词结果输出为列表
#将循环generator转化为列表
res=jieba.cut(tmpstr)
list(word for word in res)
[‘郭靖’, ‘和’, ‘哀牢山’, ‘三十六’, ‘剑’, ‘,’]
#直接使用lcut
print(jieba.lcut(tmpstr))
[‘郭靖’, ‘和’, ‘哀牢山’, ‘三十六’, ‘剑’, ‘,’]
其他模式
print('/'.join(jieba.cut(tmpstr,cut_all=True))) #全模式
郭/靖/和/哀牢山/三十/三十六/十六/剑/,
print('/'.join(jieba.cut_for_search(tmpstr))) #搜索引擎模式
print(jieba.lcut_for_search(tmpstr)) #列表形式
郭靖/和/哀牢山/三十/十六/三十六/剑/,
[‘郭靖’, ‘和’, ‘哀牢山’, ‘三十’, ‘十六’, ‘三十六’, ‘剑’, ‘,’]
修改词典
想要灵活分词,可以对分词的词典进行补充或调整,有三种形式:动态增删新词,使用自定义词典,使用现有词库
动态增删新词
即根据分词结果,对内存中的词库进行更新
- add_word(word) :word-新词;freq=None-词频;tag=None-词性
- del_word(word)
jieba.add_word('哀牢山三十六剑')
'/'.join(jieba.cut(tmpstr))
‘郭靖/和/哀牢山三十六剑/,’
jieba.del_word('哀牢山三十六剑')
'/'.join(jieba.cut(tmpstr))
‘郭靖/和/哀牢山/三十六/剑/,’
使用自定义词典
当有很多自定义词需要添加时,可以事先建立一个词库,使用自定义词典进行分词
- load_userdict(file_name)
词典基本格式:
一个词一行:词、词频(可省)、词性(可省)
用空格隔开,词典文件必须使用UTF-8编码(必要时使用Uedit32进行文件编码转换)
import os
#os.chdir(r'')
dict='金庸小说词库.txt'
jieba.load_userdict(dict)
'/'.join(jieba.cut(tmpstr))
‘郭靖/和/哀牢山三十六剑/,’
搜狗词库
按照词库分类或者关键词搜索方式,查找并下载所需词库,不需要自己从头制作词库,可以按需加入。
文件为scel格式,可使用转换工具,将其转换为txt格式(应用程序)
- 深蓝词库转换
- 奥创词库转换
去除停用词
常见停用词
- 超高频:基本不携带有效信息/歧义太多–的、地、得…
- 虚词:如介词,连词…
- 专业领域高频词:基本不携带有效信息(仅在某一场景下适用)
- 视情况而定:呵呵、emoj…
分词后去除停用词
- 读入停用词表文件
- 正常分词
- 在分词结果中去除:
新列表=[word for word in 源列表 if word not in 停用词表]
但存在的问题:停用词必须要被分词过程正确拆分才行。
newlist=[w for w in jieba.cut(tmpstr) if w not in ['和',',']]
print(newlist)
[‘郭靖’, ‘哀牢山三十六剑’]
import pandas as pd
tmpdf=pd.read_csv('停用词.txt',names=['w'],sep='aaa',
encoding='utf-8')
[w for w in jieba.cut(tmpstr) if w not in list(tmpdf.w)] #list转化为列表
[‘郭靖’, ‘哀牢山三十六剑’]
用extract_tags函数去除停用词
特点:
根据TF-IDF算法将特征词取出来,在提取之前去掉停用词(这里就不用考虑分词是否分得合适的问题,相对准确率更高)
可以人工指定停用词典
jieba.analyse.set_stop_words()
import jieba.analyse as ana
print('未使用:',jieba.lcut(tmpstr))
#使用TF_IDF算法提取关键词,并同时去掉停用词
ana.set_stop_words('停用词.txt')
print('TF_IDF提取关键词:',ana.extract_tags(tmpstr,topK=20))
未使用: [‘郭靖’, ‘和’, ‘哀牢山三十六剑’, ‘,’]
TF_IDF提取关键词: [‘郭靖’, ‘哀牢山三十六剑’]
词性标注
结巴分词中的函数: import jieba.posseg
posseg.cut( ):给出附加词性的分词结果(词性标注采用和 ICTCLAS 兼容的标记法)
可以词性做进一步处理,如只提名词或动词等…
import jieba.posseg as psg
tmpres=psg.cut(tmpstr) #附加词性的分词结果
print(tmpres)
for item in tmpres:
print(item.word,item.flag)
这里的x是未定义词性,因为“郭靖”“哀牢山三十六剑”是自定义词典加进去的,加进去的时候没有定义词性,如果自定义词典里面有指定,那么会输出词性。
psg.lcut(tmpstr) #直接输出为list,成员为pair
[pair(‘郭靖’, ‘x’), pair(‘和’, ‘c’), pair(‘哀牢山三十六剑’, ‘x’), pair(’,’, ‘x’)]
print(psg.lcut(tmpstr)[1].word)
print(psg.lcut(tmpstr)[1])
psg.lcut(tmpstr)[1]
和
和/c
pair(‘和’, ‘c’)
分词的NLTK实现
NLTK只能识别用空格作为词条分割方式,因此不能直接用于中文文本分词
一般先用jieba分词,然后转换为空格分割的连续文本,再转入NLTK框架使用
rawtext='世界那么大,我想去看看'
txt=' '.join(jieba.cut(rawtext))
print(txt)
import nltk
toke=nltk.word_tokenize(txt)
print(toke)
世界 那么 大 , 我 想 去 看看
[‘世界’, ‘那么’, ‘大’, ‘,’, ‘我’, ‘想’, ‘去’, ‘看看’]