鬼吹灯文本挖掘1:jieba分词和CountVectorizer向量化 鬼吹灯文本挖掘3:关键词提取和使用sklearn 计算TF-IDF矩阵

鬼吹灯文本挖掘1:jieba分词和CountVectorizer向量化

鬼吹灯文本挖掘2:wordcloud 词云展示

鬼吹灯文本挖掘3:关键词提取和使用sklearn 计算TF-IDF矩阵


1. 数据预处理

import pandas as pd
import numpy as np
import jieba
import re

# 1. 读取斗破苍穹文档: 共33章
gcd1_df = pd.read_csv('G:\\自学笔记\\学习笔记:Python数据分析--玩转文本挖掘\\PythonData\\鬼吹灯之精绝古城txt全本精校版.txt',\
                     sep='aaa',encoding='utf-8',names=['txt'])

# 章节判断用变量预处理
def is_chap_head(tmpstr):
    import re
    pattern = re.compile('第.{1,7}章')
    return len(pattern.findall(tmpstr))

gcd1_df['is_chap_head'] = gcd1_df.txt.apply(is_chap_head)
# raw['chap']  = 0  #初始化所有章节为0

 # 章节判断
chap_num = 0
for i in range(len(gcd1_df)):
    if gcd1_df['is_chap_head'][i] == 1:
        chap_num += 1
    gcd1_df.loc[i,'chap'] = chap_num

del gcd1_df['is_chap_head']
txt	chap
0	第一章 白纸人和鼠友	1.0
1	我的祖父叫胡国华,胡家祖上是十里八乡有名的大地主,最辉煌的时期在城里买了三条胡同相连的四十多...	1.0
2	民谚有云:“富不过三代。”这话是非常有道理的,家里纵然有金山银山,也架不住败家子孙的挥霍。	1.0
3	到了民国年间,传到我祖父这一代就开始家道中落了,先是分了家,胡国华也分到了不少家产,足够衣食...	1.0
4	胡国华年轻的时候吃喝嫖赌抽五毒俱全,到最后穷得身上连一个大子儿都没有了。人要是犯了烟瘾,就抓...	1.0


2. 分词

(1)jieba.load_userdict(filepath) 可以加载自定义词典

# 1. 获取停用词库
my_stop_words_path = 'G:\\myLearning\\pythonLearning201712\\myDicts\\新建文件夹\\综合stopword.txt'
stop_words_dict = []
with open(my_stop_words_path, errors='ignore') as fr:
    for line in fr.readlines():
        stop_words_dict.append(line.strip())
print(len(stop_words_dict))

# 2. 加载搜狗中的鬼吹灯词库
gcd_words_dict_path = 'G:\\自学笔记\\学习笔记:Python数据分析--玩转文本挖掘\\PythonData\\鬼吹灯词库.txt'
jieba.load_userdict(gcd_words_dict_path)    

(2)re.sub(pattern, '', inTxt) 根据将inTxt字符串中符号pattern的部分替换为''

# 3. 自定义分词函数
def my_cut(inTxt):
    inTxt = re.sub('[a-zA-Z0-9]','',inTxt)
    jieba.lcut(inTxt)
    words_list = jieba.lcut(inTxt)
    return ' '.join([w for w in words_list if w not in stop_words_dict and len(w) > 1])

(3)gcd1_df.txt.apply(my_cut) 是对gcd1_df.txt中的每条记录应用 my_cut 函数

gcd1_df['words_list'] = gcd1_df.txt.apply(my_cut)
gcd1_df.head()

txt	chap	words_list
0	第一章 白纸人和鼠友	1.0	第一章 白纸人和鼠友
1	我的祖父叫胡国华,胡家祖上是十里八乡有名的大地主,最辉煌的时期在城里买了三条胡同相连的四十多...	1.0	祖父 胡国华 胡家 祖上 十里八乡 有名 地主 辉煌 时期 城里 三条 胡同 相连 四十多间...
2	民谚有云:“富不过三代。”这话是非常有道理的,家里纵然有金山银山,也架不住败家子孙的挥霍。	1.0	民谚 有云 不过 三代 这话 非常 道理 家里 纵然 金山 银山 架不住 败家子 挥霍
3	到了民国年间,传到我祖父这一代就开始家道中落了,先是分了家,胡国华也分到了不少家产,足够衣食...	1.0	民国 年间 传到 祖父 一代 开始 家道中落 先是 胡国华 分到 不少 家产 足够 衣食无忧...
4	胡国华年轻的时候吃喝嫖赌抽五毒俱全,到最后穷得身上连一个大子儿都没有了。人要是犯了烟瘾,就抓...	1.0	胡国华 年轻 时候 吃喝嫖赌 五毒俱全 最后 穷得 身上 一个 大子儿 没有 要是 烟瘾 心...

3.  向量化:利用sklearn实现

    (1)df.groupby(['chap']).sum()  表示先根据chap进行分组;然后对chap值相同的部分,txt和words_list两列进行相加,             此处txt和words_list每条记录都是字符串,应用sum()函数就对字符串直接合并

# 1. 针对chap合并
gcd1_chap = gcd1_df.groupby(['chap']).sum()
gcd1_chap.head()

txt	words_list
chap		
1.0	第一章 白纸人和鼠友我的祖父叫胡国华,胡家祖上是十里八乡有名的大地主,最辉煌的时期在城里买了...	第一章 白纸人和鼠友祖父 胡国华 胡家 祖上 十里八乡 有名 地主 辉煌 时期 城里 三条 ...
2.0	第二章 《十六字阴阳风水秘术》从那以后胡国华就当了兵,甚得重用,然而在那个时代,天下大乱,军...	第二章 十六字阴阳风水秘术从那以后 胡国华 甚得 重用 然而 那个 时代 天下大乱 军阀 混...
3.0	第三章 大山里的古墓虽说是内蒙,其实离黑龙江不远,都快到外蒙边境了。居民也以汉族为主,只有少...	第三章 大山里的古墓虽说 内蒙 其实 黑龙江 不远 外蒙 边境 居民 汉族 为主 只有 少数...
4.0	第四章 昆仑不冻泉那一年的春天,中国政府的高层因为感受到国际敌对势力的威胁,不断进行战略上的...	第四章 昆仑不冻泉一年 春天 中国政府 高层 因为 感受 国际 敌对势力 威胁 不断 进行 ...
5.0	第五章 火瓢虫进山的第三天早晨,小分队抵达了大冰川,传说这附近有一个极低洼的小型盆地,我们此...	第五章 火瓢虫进山 第三天 早晨 小分队 抵达 冰川 传说 附近 一个 低洼 小型 盆地 我...

     (2)sklearn中的CountVectorizer可以实现将文本转换为稀疏矩阵,此处输入的中文文本必须是要先分好词再按空格分隔               合并为一个字符串才可以。参数min_df=5表示词必须要在至少5个文档中出现过,否则就不考虑。

gcd1_words_list = list(gcd1_chap.words_list)

from sklearn.feature_extraction.text import CountVectorizer

count_vect = CountVectorizer(min_df=5)  #  词至少在5个文档中出现过
gcd1_words_vec = count_vect.fit_transform(gcd1_words_list)
gcd1_words_vec

<33x1654 sparse matrix of type '<class 'numpy.int64'>'
	with 16484 stored elements in Compressed Sparse Row format>

    (3) 此稀疏矩阵可以方便地转换为数组/矩阵

gcd1_words_vec.toarray()
array([[ 0,  0,  4, ...,  0,  0,  2],
       [ 0,  0,  2, ...,  0,  0,  1],
       [ 3,  0, 16, ...,  0,  0,  1],
       ...,
       [ 3,  0, 13, ...,  0,  0,  1],
       [ 1,  0,  4, ...,  0,  8,  1],
       [ 0,  0,  5, ...,  0,  0,  0]], dtype=int64)

gcd1_words_vec.todense()
matrix([[ 0,  0,  4, ...,  0,  0,  2],
        [ 0,  0,  2, ...,  0,  0,  1],
        [ 3,  0, 16, ...,  0,  0,  1],
        ...,
        [ 3,  0, 13, ...,  0,  0,  1],
        [ 1,  0,  4, ...,  0,  8,  1],
        [ 0,  0,  5, ...,  0,  0,  0]], dtype=int64)

count_vect.get_feature_names()[-10:]
['黄沙', '黑乎乎', '黑暗', '黑沙漠', '黑漆漆', '黑色', '黑蛇', '黑风口', '黑驴蹄子', '鼻子']


猜你喜欢

转载自blog.csdn.net/zhuzuwei/article/details/80766106
今日推荐