文本分析3-jieba分词

笔记来自课程:玩转文本挖掘(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…

分词后去除停用词

  1. 读入停用词表文件
  2. 正常分词
  3. 在分词结果中去除:
    新列表=[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)

世界 那么 大 , 我 想 去 看看
[‘世界’, ‘那么’, ‘大’, ‘,’, ‘我’, ‘想’, ‘去’, ‘看看’]

猜你喜欢

转载自blog.csdn.net/qq_43165880/article/details/108045853