NLP中的红楼梦

2024-01-07 12:58
文章标签 nlp 红楼梦

本文主要是介绍NLP中的红楼梦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

兜兜转转学NLP学了一个月,结果还在皮毛上,今天打算使用NLP对自己喜欢的红楼梦进行梳理。

这篇文章的目的,建立红楼梦的知识库

1、主要人物说话关键字提取

2、

一、建立语料库

语料库是以后我们分词以及建立模型的基础,我们将红楼梦各章节的内容以一句话一行的形式建立语料库。

目录

└─data         # 根目录└─chapters         # 存放文档01.txt02.txt03.txt04.txt05.txt06.txt07.txt│└─corpus         # 存放语料01.txt02.txt03.txt04.txt05.txt06.txt07.txt

 

#construct_corpus.py
import re
import matplotlib.pyplot as plt
import pandas
from itertools import chain
#defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
from collections import defaultdict
from string import punctuation# 定义要删除的标点等字符
add_punc=',。、【 】 “”:;()《》‘’{}?!⑦()、%^>℃:.”“^-——=&#@¥『』'
all_punc=punctuation+add_punc
import os
os.chdir('D:/good_study/NLP/红楼梦/')
chapters_path = 'D:/good_study/NLP/红楼梦/data/chapters/'
corpus_path = 'D:/good_study/NLP/红楼梦/data/corpus/'
#/*-----------------------------------------------*/
#/* 1、各章一句话一行的形式建立语料库
#/*-----------------------------------------------*/
# 处理得到所有章节地址列表
listdir = os.listdir(chapters_path)
# listdir=listdir[:9]
#所有章节的每句话列表
sentences_all_list = []
for filename in listdir:print("正在处理第{}章节".format(filename))chapters_root_path = chapters_path + str(filename)#每个章节的每句话列表sentences_list = []with open(chapters_root_path,'r', encoding='utf8') as f:for line in f.readlines():# 把元素按照[。!;?]进行分隔,得到句子。line_split = re.split(r'[,。!;?]',line.strip())# [。!;?]这些符号也会划分出来,把它们去掉。line_split = [line.strip() for line in line_split if line.strip() not in ['。','!','?',';'] and len(line.strip())>1]#移除英文和数字line_split = [re.sub(r'[A-Za-z0-9]|/d+','',line) for line in line_split]# #移除标点符号line_split = [''.join(list(filter(lambda ch: ch not in all_punc, line) )) for line in line_split]sentences_list.append(line_split)# print("="*30)#chain.from_iterable 将嵌套的列表无缝连接在一起sentences_list = list(chain.from_iterable(sentences_list))sentences_all_list.append(sentences_list)corpus_root_path = corpus_path + str(filename)with open(corpus_root_path,"w", encoding='utf8') as f:for line in sentences_list:f.write(line)f.write('\n')#构建全书语料库
sentences_all_list = list(chain.from_iterable(sentences_all_list))
corpus_root_path=corpus_path+'whole_book.txt'
with open(corpus_root_path,"w", encoding='utf8') as f:for line in sentences_all_list:f.write(line)f.write('\n')#/*-----------------------------------------------*/
#/* 2、分析各章字数
#/*-----------------------------------------------*/
# 处理得到所有章节地址列表
listdir = os.listdir(corpus_path)
line_words_list=[]
chapter_list=[]
# listdir=listdir[:9]
#所有章节的每句话列表
for filename in listdir:corpus_root_path = corpus_path + str(filename)#提取章节数字num = int(re.findall('\d+',filename)[0])chapter_list.append(num)with open(corpus_root_path,"r", encoding='utf8') as f:line_words=0for line in f.readlines():line_words+=len(line)line_words_list.append(line_words)print("{}章节,共{}字,验证章节{}".format(filename,line_words,num))chapter_words=pandas.DataFrame({'chapter':chapter_list,'chapter_words':line_words_list})chapter_words.sort_values(by='chapter',ascending=True, inplace=True)
chapter_words = chapter_words.set_index(keys=['chapter'])
chapter_words['chapter_words'].plot(kind='bar',color = 'g',alpha = 0.5,figsize = (20,15)) 
plt.show()

处理好语料后,统计全书字数为82万,各章节字数如下图所示,每章平均字数在7000左右,字数和故事情节一样,有抑扬顿挫的节奏感,中间57-78章节字数略有高峰,也是小说中宝黛爱情走向高峰、各种人物风波矛盾纠缠迭起的时候。

 

参考资料:点此链接

《红楼梦》汉英平行语料库:http://corpus.usx.edu.cn/hongloumeng/images/shiyongshuoming.htm

现代汉语+古代汉语语料库在线检索系统:http://ccl.pku.edu.cn:8080/ccl_corpus/index.jsp?dir=xiandai

二、分词,建立红楼梦词库

分词方法分规则分词和统计分析,目前我们还没有红楼梦的词库,目前通用的汉语NLP工具均以现代汉语为核心语料,对古代汉语的处理效果很差,从网上找了甲言这个包,甲言,取「甲骨文言」之意,是一款专注于古汉语处理的NLP工具包。

 


当前版本支持词库构建、自动分词、词性标注、文言句读和标点五项功能,更多功能正在开发中。

Windows上pip install kenlm报错解决:点此链接

 

2.1 HMM

 

2.2 CRF

 

2.3 衡量分词的一致性


三、命名实体识别
四、每章摘要
五、每章内容概述
六、每章内容标签
七、红楼梦的社交网络
八、每章内容概述
九、每章内容概述
十、每章内容概述

 

未完待续...

这篇关于NLP中的红楼梦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/579985

相关文章

【python 走进NLP】两两求相似度,得到一条文本和其他文本最大的相似度

应用场景: 一个数据框里面文本,两两求相似度,得到一条文本和其他文本最大的相似度。 content source_id0 丰华股份军阀割据发生的故事大概多少w 11 丰华股份军阀割据发生的故事大概多少 22 丰华股份军阀割据发生的故事大概多少 33 丰华股份军阀割据发生的故事大概多少

【Python 走进NLP】NLP词频统计和处理停用词,可视化

# coding=utf-8import requestsimport sysreload(sys)sys.setdefaultencoding('utf-8')from lxml import etreeimport timetime1=time.time()import bs4import nltkfrom bs4 import BeautifulSoupfrom

【java 走进NLP】simhash 算法计算两篇文章相似度

python 计算两篇文章的相似度算法simhash见: https://blog.csdn.net/u013421629/article/details/85052915 对长文本 是比较合适的(超过500字以上) 下面贴上java 版本实现: pom.xml 加入依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</a

【python 走进NLP】simhash 算法计算两篇文章相似度

互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来

【python 走进NLP】文本相似度各种距离计算

计算文本相似度有什么用? 1、反垃圾文本的捞取 “诚聘淘宝兼职”、“诚聘打字员”…这样的小广告满天飞,作为网站或者APP的运营者,不可能手动将所有的广告文本放入屏蔽名单里,挑几个典型广告文本,与它满足一定相似度就进行屏蔽。 2、推荐系统 在微博和各大BBS上,每一篇文章/帖子的下面都有一个推荐阅读,那就是根据一定算法计算出来的相似文章。 3、冗余过滤 我们每天接触过量的信息,信息之间存在大量

【python 走进NLP】句子相似度计算--余弦相似度

余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。 github 参考链接:https://github.com/ZhanPwBibiBibi/CHlikelihood # -*- coding: utf-8 -*-import jiebaimport numpy as npimpor

【python 走进NLP】从零开始搭建textCNN卷积神经网络模型

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。人工智能教程 1、众所周知,tensorflow 是一个开源的机器学习框架,它的出现大大降低了机器学习的门槛,即使你没有太多的数学知识,它也可以允许你用“搭积木”的方式快速实现一个神经网络,即使没有调节太多的参数,模型的表现一般还

NLP文本相似度之LCS

基础 LCS(Longest Common Subsequence)通常指的是最长公共子序列,区别最长公共字串(Longest Common Substring)。我们先从子序列的定义理解: 一个序列S任意删除若干个字符得到新的序列T,则T叫做S的子序列。 子序列和子串的一个很大的不同点是,子序列不要求连接,而子串要求连接。 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y

NLP 文本相似度(一)

一份文本,从结构上划分可以是:字、词、句、段、篇。文本比较的粒度是词,一篇文章,可以划分成N个不同的词,选取其中包含重要信息的M个词作为这片文章的特征。M个词构成了M维的向量,两个文本之间的比较就是两个M维向量之间的比较。 余弦相似度 向量之间如何比较?我们可以采用余弦相似度,其描述如下: 一个向量空间中两个向量夹角的余弦值可以作为衡量两个个体之间差异的大小;余弦值越接近1,夹角趋于0,表明

NLP从零开始------文本中阶处理之序列到序列模型(完整版)

1. 序列到序列模型简介         序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列,输出序列称作目标序列。序列到序列有非常多的重要应用, 其中最有名的是机器翻译( machine translation), 机器翻译模型的输入是待翻译语言(源语言) 的文本,输出则是翻译后的语言(目标语言)