中文分词在大数据横行的今天是越来越有用武之地了。它不仅被广泛用于专业的中文搜索引擎中,而且在关键词屏蔽、黑白名单以及文本相似度等方面也能大显身手。中文分词最简单也最常用的方式是基于字典查找的方式,通过遍历待分词字符串并在字典中进行查找匹配以达到分词的目的。本文即是采用这种方式。
字典
在本文中,完全依赖于字典,因此需要准备好字典。一般面对不同的领域用不同的字典。比如面向医学的,则字典会添加许多医学术语方面的词。可以很容易的找到常用词的字典,比如搜狗输入法自带的字典等。
停止词
停止词不能用于成词。停止词主要包括无意义的字符(如的、地、得)或词。
常规实现
本文由于只是简单的介绍和实现,所以定义好了简单的字典和停止词,如下代码所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>简单的中文分词</title>
<meta name="author" content="" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<meta name="keywords" content="简单的中文分词" />
<meta name="description" content="简单的中文分词" />
</head>
<body>
<script type="text/javascript">
// 字典
var dict = {
"家乡" : 1,
"松花" : 1,
"松花江" : 1,
"那里" : 1,
"四季" : 1,
"四季迷人" : 1,
"迷人" : 1,
"花香" : 1
};
// 停止词
var stop = {
"的" : 1
};
// 待分词的字符串
var words = "我的家乡在松花江边上,那里有四季迷人的花香。";
</script>
</body>
</html>
dict和stop之所以定义为Object,是因为这样可令查找的时间复杂度为常值O(1)。分词的过程有点像正则表达式的惰性匹配。先从words中读取第一个字符"我"并在dict中和stop中查找,如果是停止词,则丢掉已读取的,然后读取第二个字"的"。如果在dict中,则添加到结果集,然后继续读到下一个,再同样去stop和dict中查找,直到处理完成。代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>简单的中文分词</title>
<meta name="author" content="" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<meta name="keywords" content="简单的中文分词" />
<meta name="description" content="简单的中文分词" />
</head>
<body>
<script type="text/javascript">
// 字典
var dict = {
"家乡" : 1,
"松花" : 1,
"松花江" : 1,
"那里" : 1,
"四季" : 1,
"四季迷人" : 1,
"迷人" : 1,
"花香" : 1
};
// 停止词
var stop = {
"的" : 1
};
// 待分词的字符串
var words = "我的家乡在松花江边上,那里有四季迷人的花香。";
function splitWords(words) {
var start = 0, end = words.length - 1, result = [];
while (start != end) {
var str&nb