Python文本分析---笔记

Python文本分析

格式化数据:表格、json

非格式化数据:字符串、文本

内容:

1、中文分词

2、自定义词典、去停用词

3、词频统计、关键词抽取

4、案例:招聘需求关键词抽取

一、 中文分词

分词:就是将0维的非格式化文本转化为格式化、向量化数据

中文分词:将一个汉字序列切分成一个个单独的词

英文文档中,单词之间是以空格作为自然分界符的,而中文词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在分词这一问题上,中文分词相比英文要复杂困难的多:

例如:

[0维的非格式化文本转为格式化]
分词后:
[’0维’ ‘的’ ‘非格式化’ ‘文本’ ‘转为’ ‘格式化’]

中文分词基本步骤
  1. 载入数据
  2. 分词
  3. 分词后的数据转回文本
  4. 保存分词后的文本为文本文件
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 为文件类对象或自定义词典的路径

词典格式:

  • 词中间不能有标点符号
  • 一个词占一行
  • 每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒
  • file_name若为路径或二进制方式打开的文件,则文件必须为UTF-8编码

注:词频省略时使用自动计算也能保证分出该词的词频

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)  # ['听说', '超级', '喜欢', '小游戏']

二、分词实践活动:抽取文档关键词

抽取文档关键词用于在一篇文章中获取其核心内容(描述了什么?)又叫生成摘要、打标签、关键词提取等

1、词频统计
  • 词在文本中出现的次数,某种程度上能当作文本的标签,表示文本内容
  • 不是很精确
  • 统计前最好先去完成自定义词典和去停用词的前期操作
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
'''
2、案例:分析Python互联网招聘信息中的需求关键字

大概步骤如下:

  1. 载入文本

  2. 载入自定义词典

  3. 分词

  4. 去停用词和一个字的词

  5. 计算词频排序(输出前20个)

  6. 保存结果

  7. Python文本分析---笔记_第1张图片

    ​ jieba.analyse.extract_tags(txt)

词性分析:

jieba.posseg.cut()

你可能感兴趣的:(Python数据分析,python,数据分析)