格式化数据:表格、json
非格式化数据:字符串、文本
1、中文分词
2、自定义词典、去停用词
3、词频统计、关键词抽取
4、案例:招聘需求关键词抽取
分词:就是将0维的非格式化文本转化为格式化、向量化数据
中文分词:将一个汉字序列切分成一个个单独的词
英文文档中,单词之间是以空格作为自然分界符的,而中文词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在分词这一问题上,中文分词相比英文要复杂困难的多:
例如:
[0维的非格式化文本转为格式化]
分词后:
[’0维’ ‘的’ ‘非格式化’ ‘文本’ ‘转为’ ‘格式化’]
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
# 1. 载入数据
with open('E:/text_analysis/data/test.txt', 'r', encoding='UTF-8') as f:
a = f.read()
# 2. 分词
print(a) # 我来到了网易杭研大厦,我是网易人!
b = jieba.cut(a)
print(list(b))
c = jieba.lcut(a) # 直接输出列表
print(c)
# ['我', '来到', '了', '网易', '杭研', '大厦', ',', '我', '是', '网易', '人', '!']
# 3. 分词后的数据转回文本
d = ' '.join(c)
print(d)
# 4.保存分词后的文本为文本文件
with open('E:/text_analysis/data/test_cut.txt', 'w', encoding='UTF-8') as f:
f.write(d)
一个词错误分为两个词,解决此问题
1、当句子中的某个词没有被识别分出时,可以指定自己自定义的词典,以便包含jieba词库里没有的词
2、词典文件的内容可以根据项目不断增加。查看初步分词,将分词不正确的词加入自定义词典然后重新再分,直到正确率达标。
3、虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率
jieba.load_userdict(file_name) #file name 为文件类对象或自定义词典的路径
词典格式:
注:词频省略时使用自动计算也能保证分出该词的词频
import jieba.analyse
a = '李小福是创新办主任也是云计算专家'
print(jieba.lcut(a))
# ['李小福', '是', '创新', '办', '主任', '也', '是', '云', '计算', '专家']
# 运用自定义词典 (custom中写入云计算和创新办)
jieba.load_userdict('E:/text_analysis/data/custom.txt')
print(jieba.lcut(a))
# ['李小福', '是', '创新办', '主任', '也', '是', '云计算', '专家']
使用更灵活: 一个词错误分为两个词/两个词错误分为一个词
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
# 动态增加或删除词典的词(更灵活,随用随加)
a1 = '我们中出了一个叛徒'
print(jieba.lcut(a1))
# ['我们', '中出', '了', '一个', '叛徒']
# 删除词典的词
jieba.del_word('中出')
print(jieba.lcut(a1))
# ['我们', '中', '出', '了', '一个', '叛徒']
# 添加
jieba.add_word('出了')
print(jieba.lcut(a1))
# ['我们', '中', '出了', '一个', '叛徒']
# 还原
jieba.add_word('中出')
jieba.del_word('出了')
# 调节词的词频,使其能(或不能)被分出
# tune = True:执行词频调整,默认False不执行
jieba.suggest_freq(('中', '出'), tune=True)
print(jieba.lcut(a1))
# ['我们', '中', '出', '了', '一个', '叛徒']
jieba.suggest_freq('一个叛徒', tune=True)
print(jieba.lcut(a1))
# ['我们', '中', '出', '了', '一个叛徒']
# 还原
jieba.suggest_freq('中出', tune=True)
jieba.suggest_freq(('一个', '叛徒'), tune=True)
print(jieba.lcut(a1))
# ['我们', '中出', '了', '一个', '叛徒']
分词后,将不想出现在分词结果内的词删除
注意:修改自定义词典或停用词文本文件时,不要使用记事本修改(保存时会存为UTF-8带BOM格式,导致程序载入出问题)
# 去停用词
# 当一个字符串不是词,jieba误将其分为词,或者我们不想将某些不重要的词分出来(想删掉某些分出的词)可以自定义停用词词典
# 停用词就是要从分词结果删掉的垃圾无用词
# 词典中的词不会出现在分词结果中
# 停用词词典的内容可以根据项目不断增加
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
a2 = '哎,额,听说你超级喜欢小游戏的!你是吗?'
b = jieba.lcut(a2)
print(b)
# 停用词表:
'''
哎
,
你
是
吗
!
?
\n
'''
stopword = []
with open('E:/text_analysis/data/stopword.txt', 'r', encoding='UTF-8') as f:
for line in f.readline():
l = line.strip()
if l == '\\n':
l = '\n'
if l == '\\u3000':
l = '\u3000'
stopword.append(l)
# print(stopword)
stopword = ['哎', ',', '你', '是', '吗', '!', '?', '\n']
x = np.array(b)
y = np.array(stopword)
print(np.in1d(x, y)) # x中有y吗?
# [ True True False True False True False False False False False True True True False]
print(~np.in1d(x, y)) # 取反
# [False False True False True False True True True True True False False False True]
z = x[~np.in1d(x, y)]
print(z) # ['额' '听说' '超级' '喜欢' '小游戏' '的' '!' '?']
# 去掉一个字以下的词
# 法1
k = []
for i in z:
print(len(i))
if len(i) > 1:
k.append(i)
print(k) # ['听说', '超级', '喜欢', '小游戏']
# 法2
k1 = [i for i in z if len(i) > 1]
print(k1) # ['听说', '超级', '喜欢', '小游戏']
抽取文档关键词用于在一篇文章中获取其核心内容(描述了什么?)又叫生成摘要、打标签、关键词提取等
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
a = '哎,额,听说你超级喜欢小游戏的!你是吗?'
b = jieba.lcut(a)
print(b) # ['哎', ',', '额', ',', '听说', '你', '超级', '喜欢', '小游戏', '的', '!', '你', '是', '吗', '?']
# 统计词频
pd.DataFrame(b)
# ascending=False降序
c = pd.DataFrame(b).groupby(0).size().sort_values(ascending=False)[:5]
print(c)
'''
0
, 2
你 2
? 1
! 1
额 1
dtype: int64
'''
大概步骤如下:
词性分析:
jieba.posseg.cut()