目录
一、问题描述
在参考文章的基础上,对给定语料库的信息熵进行计算,对信息熵的含义及计算方法进行切实体会与掌握。
二、语料预处理
在计算信息熵之前,首先对语料库进行一定的预处理,步骤如下:
1.读取所有语料并合并
def read_novel(path): # 读取语料内容
content = ''
names = os.listdir(path)
for name in names:
novel_name = path + '\\' + name
with open(novel_name, 'r', encoding='ANSI') as f:
con = f.read()
content += con
f.close()
return content, names
2.语料库简单处理,去除广告,空格,换行等符号
def content_deal(content): # 语料预处理,进行断句,去除一些广告和无意义内容
ad = ['本书来自www.cr173.com免费txt小说下载站\n更多更新免费电子书请关注www.cr173.com', '新语丝电子文库'
'\u3000', '\n', '。', '?', '!', ',', ';', ':', '、',
'『', '』', '(', ')', '…', '「', '」', '\ue41b', '<', '>', '+', '\x1a', '\ue42b']
for a in ad:
content = content.replace(a, '')
return content
三、词频统计
在语料库预处理完成后,进行词频统计
在一元模型下,即将每个字出现在句中的概率视为独立,此时的词频统计代码如下:
frequency_one = {
}
for word in content:
if '\u4e00' <= word <= '\u9fa5': # 直接去掉不是中文的部分,包括标点符号和一些英文字母之类
frequency_one[word] = frequency_one.get(word, 0) + 1
if mode == 1:
return frequency_one
这里通过判断'\u4e00' <= word <= '\u9fa5'
直接判断了语料是否为中文,这是为了避免一些在预处理中未能被剔除的符号、英文字母等不是中文的内容。
在二元模型下,即认为每个字出现的概率只与它的前一个字有关,此时的词频统计代码如下:
if mode == 2:
frequency_two = {
}
for i in range(len(content) - 1):
if '\u4e00' <= content[i] <= '\u9fa5' and '\u4e00' <= content[i+1] <= '\u9fa5': # 直接去掉不是中文的部分,包括标点符号和一些英文字母之类
frequency_two[(content[i], content[i + 1