文本转换为向量空间模型(1):中文分词
4251字,阅读需时15分钟

实践目标:

(1)程序的模块化设计和模块调用;

(2)正则表达式的使用;

(3)使用jieba分词进行中文分词;

(4)使用CSV模块输出CSV文件。

 

获取语料数据后,需要对语料数据进行中文分词,中文分词程序使用jieba分词,若没有安装jieba分词,需要在计算机上先安装jieba分词。

1、编写分词程序

一些词语在文本数据内出现频率很高,但实际意义又不大的词。这一类主要包括了语气助词、副词、介词、连词等,通常自身并无明确意义,这些词对文本的比对分析没有任何帮助,因此需要在分词过程中过滤掉这些词,过滤方法是把这些词放置在一个文本文件内,该文本文件称为停用词表,词表内的词称为停用词,具体放置方法是每行一个停用词,本项目的停用词表是stop_word.txt。

stop_word.txt部分内容如下图所示:

01.png

在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 stopwords
 
def 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

我要评论
全部评论