参考:https://www.cnblogs.com/pinard/p/6744056.html

import pandas as pd
import numpy as np
import jieba
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer%matplotlib inline

一、数据加载

数据使用小说《白夜行》

document = pd.read_csv("./Data/BYX.txt",encoding="GBK",header=None)
document.columns  = ['sentences'] # 重命名列名
document['sentences'] = document['sentences'].apply(lambda x: x.strip()) # 去除文本前后的空白
document['lens'] = document['sentences'].apply(len) # 统计文本长度
document = document[document['lens']>1] # 去除文本长度小于等于1的文本
document.index = np.arange(len(document))
document.head()
sentences lens
0 第一章 3
1 出了近铁布施站,沿着铁路径直向西。已经十月了,天气仍闷热难当,地面也很干燥。每当卡车疾驰而过... 66
2 笹垣润三的脚步说不上轻快。他今天本不必出勤。很久没休假了,还以为今天可以悠游地看点书。为了今... 63
3 公园出现在右边,大小足以容纳两场三垒棒球开打,丛林越野游戏、秋千、滑梯等常见的游乐设施一应俱... 67
4 公园后面有一栋兴建中的七层建筑,乍看之下平淡无奇,但笹垣知道里面几乎空无一物。在调到大阪警察... 67

二、文本长度分析

document['lens'].describe()
count    7741.000000
mean       38.602248
std        33.024336
min         2.000000
25%        15.000000
50%        29.000000
75%        52.000000
max       298.000000
Name: lens, dtype: float64
document['lens'].hist(bins=20)

三、去除特殊字符

punct = "/-'?!.,#$%\'()*+-/:;<=>@[\\]^_`{|}~`" + '""“”’' + '∞θ÷α•à−β∅³π‘₹´°£€\×™√²—–&'
def clean_special_chars(text, punct):for p in punct:text = text.replace(p, ' ')return text
document['sentences'] = document['sentences'].apply(lambda x:clean_special_chars(x,punct))

四、分词

这里使用结巴分词

先尝试对某句文本进行分词

'/'.join(jieba.cut(document['sentences'][2]))
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.914 seconds.
Prefix dict has been built succesfully.'笹垣润/三/的/脚步/说不上/轻快/。/他/今天/本/不必/出勤/。/很久没/休假/了/,/还/以为/今天/可以/悠游/地/看点/书/。/为了/今天/,/他/特地/留着/松本/清张/的/新书/没/看/。'

可以发现对文本中的日本人名分词并不准确,因此手动加入一些词汇

jieba.suggest_freq('桐原亮司',True)
jieba.suggest_freq('桐原洋介',True)
jieba.suggest_freq('笹垣润三',True)
jieba.suggest_freq('桐原弥生子',True)
jieba.suggest_freq('唐泽雪穗',True)
jieba.suggest_freq('唐泽礼子',True)
jieba.suggest_freq('园村友彦',True)
jieba.suggest_freq('松浦勇',True)
jieba.suggest_freq('寺崎忠夫',True)
jieba.suggest_freq('田川敏夫',True)
jieba.suggest_freq('秋吉雄一',True)
jieba.suggest_freq('西口奈美江',True)
1

人名分词结果正常了

'/'.join(jieba.cut(document['sentences'][2]))
'笹垣润三/的/脚步/说不上/轻快/。/他/今天/本/不必/出勤/。/很久没/休假/了/,/还/以为/今天/可以/悠游/地/看点/书/。/为了/今天/,/他/特地/留着/松本/清张/的/新书/没/看/。'

对所有文本进行分词

document['sentences'] = document['sentences'].apply(lambda x: ' '.join(jieba.cut(x)))

分词结果

document.head()
sentences lens
0 第一章 3
1 出 了 近 铁 布施 站 , 沿着 铁路 径直 向西 。 已经 十月 了 , 天气 仍 闷热... 66
2 笹垣润三 的 脚步 说不上 轻快 。 他 今天 本 不必 出勤 。 很久没 休假 了 , 还... 63
3 公园 出现 在 右边 , 大小 足以 容纳 两场 三垒 棒球 开打 , 丛林 越野 游戏 、... 67
4 公园 后面 有 一栋 兴建 中 的 七层 建筑 , 乍看之下 平淡无奇 , 但 笹垣 知道 ... 67

五、引入停用词

一些出现频率高,但是本身没什么含义的词通常会被作为停用词,例如“的”。这里使用常用的1208个停用词的停用词表。停用词下载地址

with open('./Data/stop_words.txt','r',encoding='GBK') as f:stop_words = f.read().splitlines()

六、向量化与TF-IDF

关于TF-IDF

corpus = document['sentences'].values
vector = TfidfVectorizer(stop_words=stop_words)
tfidf = vector.fit_transform(corpus)
array = tfidf.toarray()

array就一个二维矩阵,每一行代表一条文本

array.shape
(7741, 14729)

再来看一些的tf-idf值

wordlist = vector.get_feature_names() # 获得词袋模型中的所有词
for i in range(3): # 第i行文本,为了简便这里是看前3行文本for j in range(len(wordlist)):if array[i][j] != 0:print(wordlist[j])print(array[i][j])
第一章
1.0
十月
0.24989685349204657
卡车
0.22914002088030233
向西
0.2651939249707691
地面
0.24989685349204657
天气
0.22914002088030233
尘土
0.2773358936823855
已经
0.13796942335803583
布施
0.2069221287718632
干燥
0.2651939249707691
径直
0.2398209300952238
扬起
0.23582222845889703
疾驰
0.2773358936823855
皱眉
0.2565790610706412
眼睛
0.15844240759363126
铁路
0.24989685349204657
闷热
0.2651939249707691
难当
0.2773358936823855
今天
0.4389572155556546
以为
0.16140224516974414
休假
0.22732527856527882
出勤
0.25792099995568085
很久没
0.22732527856527882
悠游
0.23861724899849351
新书
0.25792099995568085
松本
0.25792099995568085
清张
0.25792099995568085
特地
0.2037285196918468
留着
0.24662902952246618
看点
0.25792099995568085
笹垣润三
0.22732527856527882
脚步
0.17121138644786196
说不上
0.2193134980413062
轻快
0.23861724899849351

七、词云

def show_wordcloud(data, title = None):wordcloud = WordCloud(background_color='white',stopwords=stop_words,max_words=50,max_font_size=40, scale=5,random_state=1,font_path = "./Fonts/msyh.ttf" # 指定一个看显示中文的字体,不然会有显示问题(字体可以下载)).generate(str(data))fig = plt.figure(1, figsize=(10,10))plt.axis('off')if title: fig.suptitle(title, fontsize=20)fig.subplots_adjust(top=2.3)plt.imshow(wordcloud)plt.show()
cloud_corpus = document[document['lens']>10]['sentences'].values # 选择长度大于10的文件当做词云的语料
show_wordcloud(cloud_corpus,title="wordcloud")

【自然语言处理】中文文本预处理及词云_以小说《白夜行》为例相关推荐

  1. 数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化...

    全文下载链接:http://tecdat.cn/?p=28877 作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活 ...

  2. python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频

    python倚天屠龙记人物关系.词云.柱状图.-词频 # -*- coding = utf-8 -*- # @Time : 2022/3/17 15:45 # @Author : luxiaoguo ...

  3. 使用Stanford NLP software进行中文文本预处理

    中文文本预处理的几个主要步骤有: 中文分词,词性标注,生成词向量,生成中文依存语法树. Stanford NLP software是Stanford NLP小组提供的一个NLP处理工具集合,部分工具支 ...

  4. NLP实现文本分词+在线词云实现工具

    实现文本分词+在线词云实现工具 词云是NLP中比较简单而且效果较好的一种表达方式,说到可视化,R语言当仍不让,可见R语言︱文本挖掘--词云wordcloud2包 当然用代码写词云还是比较费劲的,网上也 ...

  5. 使用Python做中文分词和绘制词云

    使用Python做中文分词和绘制词云 李小璐出轨云词图 作为一门编程语言,Python的编写简单,支持库强大,应用场景多,越来越多的人开始将它作为自己的编程入门语言. Python一个比较重要的场景是 ...

  6. python中文文本预处理_中文文本预处理及表示

    文本分类 一.建立语料库 文本数据的获取方法一般有两种: 使用别人做好的语料库 爬虫去获取自己的预料数据 二.文本预处理 1.除去数据中非文本部分 一般可以使用正则表达式去进行删除 2.处理中文编码问 ...

  7. Rstudio 实现 爬虫 文本分词 个性化词云设计--我爱中国我爱党

    Rstudio 爬虫 文本分词个性化词云设计 目录 1.环境准备,加载依赖 2.rvest 爬虫,数据爬取 3.jiebaR用于分词,词频统计 4.wordcloud2 结果可视化 ========= ...

  8. 使用bert将中文文本转化成词向量的方法

    使用bert将中文文本转化成词向量的方法 https://blog.csdn.net/qq_29660957/article/details/88683823

  9. 接单日记(三)文本处理之词云生成

    文章目录 接单日记(三)文本处理之词云生成 一. 实验目的 二. 实验内容 三. 程序及结果 1. 运行程序 2. 运行结果 接单日记(三)文本处理之词云生成 此为一个实验报告,故遵守实验报告的格式. ...

最新文章

  1. Data Artisans发布支持ACID事务的流式处理框架Streaming Ledger
  2. 图解VC++绘制数学曲线
  3. 你知道Spring是怎么解析配置类的吗?
  4. JavaScript|拖拽|仿Android手机九点连线开锁
  5. 漫谈C#编程中的多态与new关键字
  6. 安装中文版cacti监控华为交换机流量并实现95计费
  7. sql 数据检索后的替换格式化
  8. php中global什么意思,php中global和$GLOBALS[]的用法、解释、区别
  9. leetcode:Happy Number
  10. ThymeLeaf的eclipse插件安装
  11. 【原创】MySQL 5.6 MRR 的存储过程完美诠释
  12. arduino交通灯编程代码_Arduino初初教程3 (交通灯)
  13. 电商与ERP集成方案
  14. PMP之项目质量管理
  15. 从一无所有,到整个世界-梁宁·产品思维30讲
  16. 新手怎么创建域名?创建域名后怎么样建站?
  17. Qt启动进程ping网址
  18. 结合RocketMQ 源码,带你了解并发编程的三大神器
  19. Apache 防止恶意解析
  20. 海思开发板上挂载额外的存储空间

热门文章

  1. 微信公众号的分类与自定义菜单接口
  2. 【云原生】Docker集群部署MinIO
  3. 记录DNS未响应 / IPv4无Internet访问权限 / WIFI连接正常但无网络
  4. Java中字符的输入
  5. java控制台中文汉字乱码
  6. PS图片边缘自动填充
  7. chatgpt赋能python:Python中的立方根-一种快速简便的计算方法
  8. 汇编语言与接口技术作业
  9. html中空格字符的区别nbsp;ensp;emsp;
  10. 能率琉光热水器 炫彩上市,开启美学新篇章