为获得文本数据的有价值信息,我们需要将文本数据进一步细分为语句和词汇。文本切分技术包括句子切分和词汇切分,句子切分一般用标点符号来直接切分,词汇切分则是每个句子进一步分解成词汇。接下来,我们将重点讨论一下词汇切分,词汇切分也是我们常说的中文分词。
一、中文分词概述
中文分词是指将连续的中文文本切分成有意义的、符合语言习惯的词汇序列的过程。由于中文写作时不像英文那样在单词之间有明显的空格分隔,中文分词成为中文自然语言处理中的一项基础且关键的技术。正确的分词结果对于后续的文本处理任务,如词性标注、句法分析、情感分析等,都有着至关重要的影响。
目前中文分词还是一个难题——对于需要上下文区别的词以及新词(人名、地名等)很难完美的区分。国际上将同样存在分词问题的韩国、日本和中国并称为CJK(Chinese Japanese Korean),三国的文字也被称为统一汉字,并赋予其在ISO 10646及统一码标准中有相同编码。
二、语料库和词典
2.1 语料库
2.1.1 语料库简介
语料库是自然语言处理和计算语言学研究中使用的大型文本数据库,包含了大量真实语言材料的集合,用于语言模型训练、语言学研究和各种语言处理任务的开发和测试。
常用语料库包括:
- 搜狗实验室提供的新闻语料:覆盖广泛的新闻文本。
- 中文维基百科语料:中文维基的所有条目,适合进行语义相关的研究。
- 人民日报语料库:涵盖多年的人民日报文章,经常用于词性标注和句法分析研究。
- THUCNews:清华大学提供的新闻分类语料库,常用于文本分类任务。
2.1.2 语料库标注
语料库一般是由人工标注的,如果只是学习,我们可以借助已标注好的语料库,进行模型训练等,语料库越大,训练效果也会越好。因为模型训练是依据已标注好的语料,因此,语料库的准确性对训练结果影响也很大。语料库标注一般包含分词识别、词性识别、命名实体识别等。接下来,我们重点看下语料库中分词的标注。
分词语料库中每个字都一个标识(隐藏状态),标识当前字在这个词语的位置,然后可以根据语料库得到所有标识形成一个序列。语料库中的分词标识包含B、M、E、S四种,释义如下:
B(Begin):词语开始
M(Middle):词语中间
E(End):词语结束
S(Single):单独成词
例如:我喜欢看热辣滚烫这个电影
这句话分词结果为:我 喜欢 看 热辣滚烫 这个 电影
则这句话的标识序列为:S BE S BMME BE BE
这样,我们可以根据已分好的词得到每个字的状态,这就是语料库标注;同时,我们也可以根据大量语料库中每个字的状态,运用HMM模型进行训练,预测我们待切分文本的分词结果。
2.2 词典
2.2.1 词典简介
词典是指的是一个包含词语及其相应信息的库或文件,整体上和我们日常用的字典在结构上很是相似的,它用于辅助中文文本分词和语义分析。词典定义通常包括以下信息:
- 词语:词典中包含的中文词语,如单字词、词组、专有名词等。
- 词性:每个词语的词性,例如名词、动词、形容词、副词等,有些词典还可能包括更详细的细分词性。
- 频率信息:有些词典可能包含词语的频率信息,用于帮助语言处理系统更好地理解语言使用中的词语偏好和使用频率。
- 义项:针对一词多义的词语,词典可能包含相应的义项信息,用于消歧和语义分析。
- 其他信息:例如拼音、词语的词义解释、词语的相关词汇搭配等附加信息。
中文分词常常依赖于有效的词典定义来辅助分析和理解中文文本。常见的中文分词词典如下:
2.2.2 知网Hownet
知网(Hownet)是一个基于概念网络的词汇知识库,旨在帮助计算机理解和处理自然语言。知网包含中文和英文两个版本词库,分别有6个类别。知网的应用范围包括自然语言处理、信息检索、智能问答系统等。它不仅可以帮助计算机理解和分析文本,还可以支持词义消歧、情感分析、信息抽取等任务。通过整合人类的词汇知识和语义关系,Hownet为计算机提供了一种有效的方式来理解和处理自然语言。
2.2.3 THUOCL
THUOCL(THU Open Chinese Lexicon)是由清华大学自然语言处理与社会人文计算实验室整理推出的一套高质量的中文词库,目前包含11个类别。词表来自主流网站的社会标签、搜索热词、输入法词库等。THUOCL具有以下特点:
- 包含词频信息值DF(Document Frequency),数字越大表示词语在语料库中的越常见。
- 词库经过多轮人工筛选,保证词库收录的准确性。
- 开放更新,将不断更新现有词表,并推出更多类别词表。
该词库可以用于中文分词、词性标注、实体识别、情感分析等自然语言处理任务中。
2.2.4 李军中文褒贬义词典
李军中文褒贬义词典由清华大学计算机学院的李军教授及其研究团队开发的情感分析词典。该词典通过人工标注大量中文词语的情感极性,并结合大规模的中文文本语料库进行构建的,将汉语词汇划分为褒义词和贬义词(negative词汇4470个,positive词汇5568个),并广泛应用于自然语言处理的情感分析、舆情监控、品牌口碑分析等领域,对于分析文本中的情感色彩和情感倾向具有重要作用。
2.2.5 台湾大学NTUSD
台湾大学NTUSD,又被称为台湾大学情感词汇本体库,是由台湾大学的文学院,以及计算机科学与信息工程学院的研究团队合作开发的情感分析词库(negative词汇8276个,positive词汇2810个),它包含简体版和繁体版。这个词库是为了支持中文文本情感分析和相关研究而开发的,它包含了大量中文词语以及这些词语的情感极性信息,用于帮助分析文本中的情感色彩。NTUSD 以新闻、微博、论坛等大规模中文文本语料为基础,通过人工标注和自动化方法建立了包含情感信息的词库。
2.2.6 大连理工情感词典
大连理工大学情感词典是由大连理工大学信息检索研究室开发的用于情感分析的中文词典。这个词典从不同角度描述一个中文词汇或者短语,包括词语词性种类、情感类别、情感强度及极性等信息。该词典情感共分为7大类21小类。
构造该资源的宗旨是在情感计算领域,为中文文本情感分析和倾向性分析提供一个便捷可靠的辅助手段。中文情感词汇本体可以用于解决多类别情感分类的问题,同时也可以用于解决一般的倾向性分析的问题。
三、中文分词方法
在做文本挖掘的时候,首先要做的预处理就是分词,中文分词的方法有以下几种:
基于词典的分词方法:首先构建一个词典,然后通过匹配词典中的词来进行分词。当遇到词典中没有的新词时,则采用其他方法进行处理。
基于规则的分词方法:通过设置一些规则,如词的长度、词的频率、词的位置等,来进行分词。
基于统计的分词方法:通过分析文本中的词语出现的频率和位置等信息,利用统计模型进行分词。
基于机器学习的分词方法:利用机器学习算法来构建分词模型,通过训练数据来学习词语的分布规律,然后利用该模型对新的文本进行分词。
基于深度学习的分词方法:利用深度学习算法,如循环神经网络(RNN)、卷积神经网络(CNN)等,来学习中文分词的模式和规律。
除上述五种方法,还有基于词典与统计相结合的方法,比如jieba分词,不同的分词方法适用于不同的场景和任务,选择合适的分词方法需要根据具体需求进行评估和选择。
接下来我们来讨论一下基于词典的分词方法和jieba分词方法。
3.1 基于词典的分词方法
基于词典的分词方法主要通过预定义的词典来匹配和切分中文文本,这种方法的优点是实现简单,对于标准文本具有较高的切分准确性。但其缺点也是显而易见的,首先,依赖于词典的完整性和更新,如果词典的质量、容量和广度不够,则会对分词结果造成影响,如“打击了”就很有可能被切分为“打击/了”,失去了应该表达的含义。其次,词典词汇切分不能对歧义问题进行有效的处理,比如,“羽毛球拍卖完了”这句话,在词汇切分的过程中,就可能出现以下的两种不同的切分的方式:情况1:羽毛球拍/卖/完/了。情况2:羽毛球/拍卖/完/了。再次,可能对新词、专有名词识别不足。
基于词典的分词方法主要包括正向最大匹配(FMM)、逆向最大匹配(BMM)和双向最大匹配(BiMM)。
3.1.1 正向最大匹配(FMM)
从左向右取待切分文本的MaxLen个字符作为匹配字段,MsxLen为所用词典中最长词条个数。查找词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。
具体流程图如下:
Python实现正向最大匹配算法示例:
# 正向最大匹配算法
def forward(text, word_dict, max_len):
result_f = []
start_index = 0
while start_index < len(text):
matched = False
# 尝试匹配的最大长度不应超过文本剩余部分
for end_index in range(min(len(text), start_index + max_len), start_index, -1):
potential_word = text[start_index:end_index]
if potential_word in word_dict:
result_f.append(potential_word)
start_index = end_index
matched = True
break
if not matched:
# 如果没有匹配到,则返回单个字符
result_f.append(text[start_index])
start_index += 1
return result_f
# 示例
word_dict = {'我们', '在野', '生动', '动物园', '野生'}
text = "我们在野生动物园玩"
max_len = max(len(word) for word in word_dict) # 最大词长度
result_f = forward(text, word_dict, max_len)
print(f'正向最大匹配结果:{result_f}')
3.1.2 逆向最大匹配(BMM)
从右向左取待切分汉语句的MaxLen个字符作为匹配字段,MaxLen为词典中最长词条个数。查找词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。**逆向最大匹配算法在处理中文往往会比正向要准确,**因为它能有效减少因前缀相似导致的错误匹配。
具体流程图如下:
Python实现逆向最大匹配算法示例:
# 逆向最大匹配算法
def backward(text, word_dict, max_len):
result_b = []
end_index = len(text)
while end_index > 0:
matched = False
for start_index in range(max(0, end_index - max_len), end_index):
potential_word = text[start_index:end_index]
if potential_word in word_dict:
result_b.append(potential_word)
end_index = start_index
matched = True
break
if not matched:
result_b.append(text[end_index-1])
end_index -= 1
return result_b[::-1]
# 示例
word_dict = {'我们', '在野', '生动', '动物园', '野生'}
text = "我们在野生动物园玩"
max_len = max(len(word) for word in word_dict)
result_b = backward(text, word_dict, max_len)
print(f'逆向最大匹配结果:{result_b}')
3.1.3 双向最大匹配(BiMM)
同时使用正向最大匹配法和逆向最大匹配法进行分词,然后比较两种方法的结果,根据某种标准(如分词数量、自由度)选择较优的一个。双向最大匹配结合了两者的优点,但计算量更大。
比较规则:
1、如果正反向分词结果词数不同,则取分词数量较少的那个。
2、如果分词结果词数相同:
a.分词结果相同,就说明没有歧义,可返回任意一个。
b.分词结果不同,返回其中单字较少的那个。
Python实现双向最大匹配算法示例:
# 双向最大匹配算法
def bi_directional_max_match(text, word_dict):
# 正反向分词结果词数不同,则取分词数量较少的那个
if len(result_f) != len(result_b):
return result_f if len(result_f) < len(result_b) else result_b
# 分词结果词数相同,分词结果相同
else:
if result_f == result_b:
return result_f
# 分词结果词数相同,分词结果不同,返回其中单字较少的那个
else:
fmm_single_chars = sum(1 for word in result_f if len(word) == 1)
bmm_single_chars = sum(1 for word in result_b if len(word) == 1)
return result_f if fmm_single_chars < bmm_single_chars else result_b
# 示例
word_dict = {'我们', '在野', '生动', '动物园', '野生'}
text = "我们在野生动物园玩"
print(f'双向最大匹配结果:{bi_directional_max_match(text, word_dict)}')