统计“三国演义.txt”里出场次数最多的10个代表性人物。
1、排除干扰词“将军”,“却说”,“荆州”,“二人”,“不可”,“不能”,“如此”等。
2、对同一个人物的不同名称进行整合处理, 例如:
“诸葛亮”、“孔明曰”指的都是“孔明”,
“曹操”又被称为“孟德”、“丞相”,
“关公”、“云长”指的都是“关羽”,
“玄德”、“玄德曰”指的都是“刘备”等等
这个试试jieba库,然后自己过滤一下
问题描述:如何对“三国演义.txt”进行词频统计,并筛选出出场次数最多的10个代表性人物?需要用到的技术或工具,对干扰词和人物名称整合处理的具体流程,以及需要注意的问题。
解决方案: 1. 技术或工具:Python编程语言,常用的相关库有re、collections等。 2. 对干扰词和人物名称整合处理的具体流程: a. 去除干扰词:通过对文本进行分词,选取关键词,去除无意义的停用词,得到有效的文本。 b. 对人物名称进行整合:根据文本中出现的人物名称进行整合,对同一人物可能存在多种写法的情况进行统一。 3. 注意问题: a. 考虑到文本中可能出现人名与其他词语同名的情况,需要进行特别处理。 b. 考虑到人物名字经常会出现在对话语句中,需要对对话部分进行特别处理。 c. 文件编码问题:需先确认文件编码类型,进行相应的编码转换。
具体代码如下:
import re
import collections
# 定义正则模式,用于匹配人名
pattern = re.compile(r"[^,。!?\n]+[曰说答应]|[^\u4e00-\u9fa5,a-zA-Z0-9]+[曰说答应]|[^\u4e00-\u9fa5,a-zA-Z0-9]+[字号]")
# 打开文件,读取文本内容
with open('三国演义.txt', encoding='utf-8') as f:
text = f.read()
f.close()
# 对文本进行分词,选取关键词,去除无意义的停用词,得到有效的文本
# 这里使用jieba库进行分词,并去除停用词
import jieba
jieba.load_userdict('userdict.txt')
stopwords = [line.rstrip() for line in open('stopwords.txt', 'r', encoding='utf-8')]
segments = [seg for seg in jieba.cut(text) if seg not in stopwords]
# 创建空字典
character_dict = {}
# 循环遍历出现的人名,统计频率
# 注意处理同一人物名称不同写法的情况
for segment in segments:
results = pattern.findall(segment)
for result in results:
name = re.sub(r"[曰说答应]|[字号]", '', result)
if name in character_dict:
character_dict[name] += 1
else:
if len(name) > 1:
character_dict[name] = 1
# 对统计结果进行排序,取前10个代表性人物
sorted_dict = dict(collections.Counter(character_dict).most_common(10))
# 输出结果
for name, freq in sorted_dict.items():
print(name, freq)
其中,三国演义.txt
为需要统计词频的文件名,jieba
库需要自己安装,userdict.txt
为自定义词典文件,里面存放了一些人物名称,stopwords.txt
是停用词表,需要自己准备。