当前位置:   article > 正文

NLP中的红楼梦_古文nlp’

古文nlp’

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

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

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

2、

一、建立语料库

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

目录

  1. └─data # 根目录
  2. └─chapters # 存放文档
  3. 01.txt
  4. 02.txt
  5. 03.txt
  6. 04.txt
  7. 05.txt
  8. 06.txt
  9. 07.txt
  10. └─corpus # 存放语料
  11. 01.txt
  12. 02.txt
  13. 03.txt
  14. 04.txt
  15. 05.txt
  16. 06.txt
  17. 07.txt

 

  1. #construct_corpus.py
  2. import re
  3. import matplotlib.pyplot as plt
  4. import pandas
  5. from itertools import chain
  6. #defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
  7. from collections import defaultdict
  8. from string import punctuation
  9. # 定义要删除的标点等字符
  10. add_punc=',。、【 】 “”:;()《》‘’{}?!⑦()、%^>℃:.”“^-——=&#@¥『』'
  11. all_punc=punctuation+add_punc
  12. import os
  13. os.chdir('D:/good_study/NLP/红楼梦/')
  14. chapters_path = 'D:/good_study/NLP/红楼梦/data/chapters/'
  15. corpus_path = 'D:/good_study/NLP/红楼梦/data/corpus/'
  16. #/*-----------------------------------------------*/
  17. #/* 1、各章一句话一行的形式建立语料库
  18. #/*-----------------------------------------------*/
  19. # 处理得到所有章节地址列表
  20. listdir = os.listdir(chapters_path)
  21. # listdir=listdir[:9]
  22. #所有章节的每句话列表
  23. sentences_all_list = []
  24. for filename in listdir:
  25. print("正在处理第{}章节".format(filename))
  26. chapters_root_path = chapters_path + str(filename)
  27. #每个章节的每句话列表
  28. sentences_list = []
  29. with open(chapters_root_path,'r', encoding='utf8') as f:
  30. for line in f.readlines():
  31. # 把元素按照[。!;?]进行分隔,得到句子。
  32. line_split = re.split(r'[,。!;?]',line.strip())
  33. # [。!;?]这些符号也会划分出来,把它们去掉。
  34. line_split = [line.strip() for line in line_split if line.strip() not in ['。','!','?',';'] and len(line.strip())>1]
  35. #移除英文和数字
  36. line_split = [re.sub(r'[A-Za-z0-9]|/d+','',line) for line in line_split]
  37. # #移除标点符号
  38. line_split = [''.join(list(filter(lambda ch: ch not in all_punc, line) )) for line in line_split]
  39. sentences_list.append(line_split)
  40. # print("="*30)
  41. #chain.from_iterable 将嵌套的列表无缝连接在一起
  42. sentences_list = list(chain.from_iterable(sentences_list))
  43. sentences_all_list.append(sentences_list)
  44. corpus_root_path = corpus_path + str(filename)
  45. with open(corpus_root_path,"w", encoding='utf8') as f:
  46. for line in sentences_list:
  47. f.write(line)
  48. f.write('\n')
  49. #构建全书语料库
  50. sentences_all_list = list(chain.from_iterable(sentences_all_list))
  51. corpus_root_path=corpus_path+'whole_book.txt'
  52. with open(corpus_root_path,"w", encoding='utf8') as f:
  53. for line in sentences_all_list:
  54. f.write(line)
  55. f.write('\n')
  56. #/*-----------------------------------------------*/
  57. #/* 2、分析各章字数
  58. #/*-----------------------------------------------*/
  59. # 处理得到所有章节地址列表
  60. listdir = os.listdir(corpus_path)
  61. line_words_list=[]
  62. chapter_list=[]
  63. # listdir=listdir[:9]
  64. #所有章节的每句话列表
  65. for filename in listdir:
  66. corpus_root_path = corpus_path + str(filename)
  67. #提取章节数字
  68. num = int(re.findall('\d+',filename)[0])
  69. chapter_list.append(num)
  70. with open(corpus_root_path,"r", encoding='utf8') as f:
  71. line_words=0
  72. for line in f.readlines():
  73. line_words+=len(line)
  74. line_words_list.append(line_words)
  75. print("{}章节,共{}字,验证章节{}".format(filename,line_words,num))
  76. chapter_words=pandas.DataFrame({'chapter':chapter_list,
  77. 'chapter_words':line_words_list})
  78. chapter_words.sort_values(by='chapter',ascending=True, inplace=True)
  79. chapter_words = chapter_words.set_index(keys=['chapter'])
  80. chapter_words['chapter_words'].plot(kind='bar',color = 'g',alpha = 0.5,figsize = (20,15))
  81. 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 衡量分词的一致性


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

 

未完待续...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/884771
推荐阅读
相关标签
  

闽ICP备14008679号