实践目标:
(1)程序的模块化设计和模块调用;
(2)正则表达式的使用;
(3)使用jieba分词进行中文分词;
(4)使用CSV模块输出CSV文件。
获取语料数据后,需要对语料数据进行中文分词,中文分词程序使用jieba分词,若没有安装jieba分词,需要在计算机上先安装jieba分词。
1、编写分词程序
一些词语在文本数据内出现频率很高,但实际意义又不大的词。这一类主要包括了语气助词、副词、介词、连词等,通常自身并无明确意义,这些词对文本的比对分析没有任何帮助,因此需要在分词过程中过滤掉这些词,过滤方法是把这些词放置在一个文本文件内,该文本文件称为停用词表,词表内的词称为停用词,具体放置方法是每行一个停用词,本项目的停用词表是stop_word.txt。
stop_word.txt部分内容如下图所示:

在tool目录下建立participle.py文件。
程序清单 participle.py
# 导入中文分词库import jieba# 导入正则模块import re#导入路径模块#导入路径模块from tool import filepath as path# 去除文本控制符def remove_control_chars(text):text = re.sub(r'[\x00-\x1F\xc2\x20\xa0\u3000]+','',text)return text#创建停用词表def get_stopwords():# 存储停用词列表stopwords = []# 读取停用词stopwordpath = path.get_stopwords_path()with open(stopwordpath,"r",encoding='UTF-8') as stopwordfile:lines = stopwordfile.readlines()for line in lines:# 去除文本前后的空格和换行符line = line.strip()stopwords.append(line)return stopwordsdef get_particlple(text):fctext = text# 去除文本前后的空格和换行符fctext = fctext.strip()# 去除文本内控制符fctext = remove_control_chars(fctext)# 对每个稿件进行分词words = jieba.lcut(fctext)# 存储分词列表texts = []# 读取停用词表stop_words = get_stopwords()# 使用正则判断数字pattern = re.compile('[0-9]+')# 去除停用词的分词use_words = []for word in words:if word not in stop_words:match = pattern.findall(word)if len(match) == 0:texts.append(word)return texts
remove_control_chars()函数使用正则表达式过滤文本控制符。
get_stopwords()函数读取停用词表的全部停用词,并存储到列表对象,在分词过程中,判断切分的词语是否在停用词表内,若属于停用词,则忽略该切分的词语。函数调用了filepath模块的get_stopwords_path()函数,该函数获取停用词表文件的位置路径,需要在filepath.py文件添加get_stopwords_path()函数。
# 获取停用词表文件路径def get_stopwords_path():return get_root_path() + "stop_word.txt"
get_particlple(text)是分词函数,对传入的text进行中文分词,首先调用remove_control_chars()函数过滤text内的文本控制符,然后调用jieba分词的lcut()函数对text进行中文分词,lcut函数返回一个列表对象,该列表对象存储了从text切分的词语,最后过滤停用词表内的停用词和数字,返回列表对象texts。
2、 验证分词程序
分词程序编写完成后,还需要验证分词程序是否能正确切分词语。编写一个测试程序,从数据库读取部分语料数据,调用分词程序对语料数据进行分词,并将切分的词语写入到CSV文件。
在项目根目录下,建立test目录,该目录主要存储测试程序文件。在test目录下建立particlple_test.py文件。
程序清单 particlple_test.py
# 分词测试程序#导入db模块#from db import readnews#导入路径模块from tool import participle as fc# 导入csv模块import csv#导入路径模块import tool.filepath as path# 程序入口if __name__ == '__main__':# 读取前6条语料数据data = readnews.query_database_record_limit(0,6)if data == None:print("数据库读取发生错误")else:texts = []for text in data:words = fc.get_particlple(text[1])texts.append(words)# 分词数据写入CSV文件fencipath = path.get_root_path() + "fenci.csv"with open(fencipath,"w+",encoding='GB18030',newline='') as fencifile:w = csv.writer(fencifile)for line in texts:w.writerow(line)
分词测试程序执行过程说明如下:
1、调用readnews模块的query_database_record_limit函数读取前6条语料数据,存储到data列表对象,对象元素是二元组类型,存储了语料数据的guid和content,guid是语料的唯一标识,content是语料内容。
2、遍历data列表对象,调用participle模块的get_particlple函数对每条语料数据进行分词处理,将分词结果存储到texts列表对象。
3、调用CSV模块的相关函数将texts列表对象的内容写入CSV文件。
3、实践过程遇到的问题
问题1:模块文件找不到问题
在编写模块化程序过程中,这类问题是经常遇到的。若已经把包含项目根目录位置路径的pth文件放置到Python的标准库目录,再次出现此类问题时,多少原因是模块名称拼写错误,需要仔细检查导入的模块名称,另外导入其它模块文件时,模块文件位置路径一般从根目录开始。
例如:项目根目录下有tool目录,tool目录下有filepath模块,导入该模块的语句如下:
import tool.filepath as path
或者:
from tool import filepath as path




