`

分词算法–正向最大匹配和反向最大匹配

 
阅读更多
转自:http://www.zetascope.com/url/e152944a5c106b0d1453bda63adec25d/content

最近看了一下分词算法的东西,整理如下:

下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配。
这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个”充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。
按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率

定义比较抽象,举个例子来说明正向最大匹配和反向最大匹配。

例子:’今天来了许多新同事’
1.正向最大匹配方式,最大长度为5
今天来了许
今天来了
今天来
今天 ====》 得到一个词–今天
来了许多新
来了许多
来了许
来了
来 ====》 得到一个词–来
了许多新同
了许多新
了许多
了许
了 ====》 得到一个词–了
许多新同事
许多新同
许多新
许多 ====》得到一个词– 许多
新同事
新同
新 ====》得到一个词– 新
同事 ====》得到一个词– 同事

最后正向最大匹配的结果是:

/今天/来/了/许多/新/同事/

2.反向最大匹配方式,最大长度为5
许多新同事
多新同事
新同事
同事 ====》得到一个词– 同事
来了许多新
了许多新
许多新
多新
新 ====》得到一个词– 新
天来了许多
来了许多
了许多
许多 ====》得到一个词– 许多
今天来了
天来了
来了
了 ====》得到一个词– 了
今天来
天来
来 ====》得到一个词– 来
今天 ====》得到一个词– 今天

最后反向最大匹配的结果是:

/今天/来/了/许多/新/同事/

正向最大匹配和反向最大匹配的结果并不一定相同

例子:’我一个人吃饭’
1.正向最大匹配方式,最大长度为5
我一个人吃
我一个人
我一个
我一
我 ====》得到一个词– 我
一个人吃饭
一个人吃
一个人
一个 ====》得到一个词– 一个
人吃饭
人吃
人 ====》得到一个词– 人
吃饭 ====》得到一个词– 吃饭

最后正向最大匹配的结果是:

/我/一个/人/吃饭/

2.反向最大匹配方式,最大长度为5
一个人吃饭
个人吃饭
人吃饭
吃饭 ====》得到一个词– 吃饭
我一个人
一个人
个人 ====》得到一个词– 个人
我一
一 ====》得到一个词– 一
我 ====》得到一个词– 我

最后反向最大匹配的结果是:

/我/一/个人/吃饭/

这次两种方式的结果就不一致了。

下面贴出ORACLE中实现的脚本:

CREATE OR REPLACE FUNCTION get_keys(in_str VARCHAR2,
in_dir VARCHAR2,
in_max NUMBER) RETURN VARCHAR2 AS
n_length NUMBER;
n_start NUMBER;
n_str VARCHAR2(2000);
n_substr VARCHAR2(2000);
n_output VARCHAR2(2000);
n_count NUMBER;
n_max NUMBER;
n_last NUMBER;
BEGIN

n_length := length(in_str);
n_output := ‘/’;
n_last := 0;

IF n_length = 0 THEN
RETURN ‘0′;
ELSIF n_length < in_max THEN
n_max := n_length;
ELSE
n_max := in_max;
END IF;

IF in_dir = ‘1′ THEN
n_str := in_str;
ELSE
SELECT reverse(in_str) into n_str from dual;
END IF;

n_substr := SUBSTR(n_str, 1, n_max);
n_start := 1;

WHILE (n_substr IS NOT NULL) LOOP

IF LENGTH(n_substr) < n_max THEN
n_max := LENGTH(n_substr);
END IF;

FOR c2 IN 0 .. n_max - 1 LOOP
if in_dir = ‘1′ then
SELECT COUNT(*)
INTO n_count
FROM dic
WHERE KEY = SUBSTR(n_substr, 1, n_max - c2);
else
SELECT COUNT(*)
INTO n_count
FROM dic
WHERE reverse(KEY) = SUBSTR(n_substr, 1, n_max - c2);
end if;
DBMS_OUTPUT.put_line(SUBSTR(n_substr, 1, n_max - c2));

IF n_count > 0 THEN
n_output := n_output || SUBSTR(n_substr, 1, n_max - c2) || ‘/’;
n_start := n_start + n_max - c2;
n_last := 1;
EXIT;
END IF;

IF c2 = n_max - 1 THEN
if n_last = 0 then
n_output := substr(n_output, 1, length(n_output) - 1) ||
SUBSTR(n_substr, 1, n_max - c2) || ‘/’;
else
n_output := n_output || SUBSTR(n_substr, 1, n_max - c2) || ‘/’;
end if;
n_start := n_start + n_max - c2;
n_last := 1;
END IF;

END LOOP;

n_substr := SUBSTR(n_str, n_start, n_max);

END LOOP;

IF in_dir = ‘1′ THEN
RETURN n_output;
ELSE
select reverse(n_output) into n_output from dual;
RETURN n_output;
END IF;

END;

有兴趣的同学可以测试一下
CREATE OR REPLACE FUNCTION get_keys(in_str VARCHAR2, –输入字符串
in_dir VARCHAR2, –匹配方式,’1′正向,’0′反向
in_max NUMBER) –匹配长度
RETURN VARCHAR2
函数示例

SQL> select get_keys(’阿里巴巴(中国)网络技术有限公司’,'0′,5) from dual;

GET_KEYS(’阿里巴巴(中国)网络技
——————————————————————————–
/阿里巴巴/(/中国/)/网络技术/有限公司/

SQL> select get_keys(’阿里巴巴(中国)网络技术有限公司’,'1′,5) from dual;

GET_KEYS(’阿里巴巴(中国)网络技
——————————————————————————–
/阿里巴巴/(/中国/)/网络技术/有限公司/

SQL> select get_keys(’明天应该也是个大晴天’,'1′,5) from dual;

GET_KEYS(’明天应该也是个大晴天
——————————————————————————–
/明天/应该/也/是/个/大/晴天/

SQL> select get_keys(’明天应该也是个大晴天’,'0′,5) from dual;

GET_KEYS(’明天应该也是个大晴天
——————————————————————————–
/明天/应该/也/是/个/大/晴天/
分享到:
评论

相关推荐

    分词匹配算法:正向最大匹配和反向最大匹配

    分词匹配算法:正向最大匹配和反向最大匹配 分词匹配算法是自然语言处理领域中的一种重要技术,它的主要目的是将汉字串切分为单个词语,以便于进一步的语言处理。分词匹配算法有多种类型,其中机械分词方法是最基本...

    基于分词的正向最大匹配和反向最大匹配算法

    正向最大匹配(Forward Maximum Matching, FMM)和反向最大匹配(Backward Maximum Matching, BMM)是两种常见的中文分词算法,它们基于词典进行操作,旨在提高分词的准确性和效率。 **正向最大匹配算法(FMM)** ...

    中文分词的正向和反向最大匹配算法

    在这个过程中,最大匹配算法是一种广泛应用的方法,它分为正向最大匹配(Forward Maximum Matching, FMM)和反向最大匹配(Backward Maximum Matching, BMM)两种策略。 正向最大匹配法是从文本的起始位置开始,...

    正向最大匹配分词算法 perl版

    perl 写的正向最大匹配分词模块。 # #正向最大分词 #eg: my $seg = new Segmenter($list); # my $list_arrref = $seg-&gt;segment($line); #

    中文分词-C语言编写正向和反向最大匹配算法

    本程序是北京师范大学学生根据一个中文字库对所给的文章进行分词。...采用的算法是正向最大匹配算法和反向最大匹配算法。主要实现屏幕分词和文件分词两项功能。因为对毕业设计有所帮助,所以我要分高一点哈~勿怪偶~

    反向最大匹配算法实现中文分词

    MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本程序实现了反向最大匹配算法。 本程序还可以从我的github上面下载:https://github.com/Zehua-Zeng/Reverse-Maximum-Matching-Algorithm

    中文正向最大匹配

    有正向和反向两种匹配方式:正向最大匹配是从左到右进行匹配,而反向最大匹配则从右到左进行匹配。通常,正向最大匹配在处理歧义性较低的文本时表现更好,因为它可以避免因短词匹配而导致的错误切分。 在实现正向...

    双向匹配分词算法 Java

    传统的分词方法通常采用正向最大匹配或反向最大匹配,但这些方法可能会因为单方向查找而遗漏某些可能的词语。双向匹配分词算法则试图解决这个问题,它会同时从字符串的左右两端进行匹配,确保尽可能找出所有可能的...

    不依赖第三方的java分词算法

    分词算法通常有多种,其中提到的“正向最大匹配”(Forward Maximum Matching, FMM)和“反向最大匹配”(Backward Maximum Matching, BMM)是两种常见的方法。 1. **正向最大匹配算法**:这种算法从文本的起始位置开始...

    最大匹配算法 中文分词

    这种方法可以分为正向最大匹配(Forward Maximum Matching,FMM)和逆向最大匹配(Backward Maximum Matching,BMM)两种。 在给出的部分代码中,主要实现了逆向最大匹配算法。具体来说,它首先计算句子的长度,...

    中文分词算法解析

    此外,文章还提到了隐马尔可夫模型(Hidden Markov Model, HMM)和最大概率方法,这些方法通过统计和概率模型来处理分词问题,通常需要大量的语料库进行训练。如ICTCLAS(Institute of Computing Technology, ...

    最大匹配法文本分词

    总结来说,最大匹配法是一种基础而实用的中文分词技术,它结合了正向和反向策略,利用训练语料库构建词典,并通过比较和选择最长的合法词语序列来完成分词任务。在实际应用中,还需要不断优化和改进,以适应不同场景...

    基于python开发的微型中文分词器 附完整代码

    以下几种分词算法: 1.按照词语的频率来利用构建 DAG来分词,使用 Trie Tree 构建前缀字典树 2.使用隐马尔可夫模型来分词 3.融合 DAG 和 HMM 两种分词模型的结果,按照分词粒度最大化的原则进行融合得到的模型 4.正向...

    最大匹配算法Java原代码

    它分为正向最大匹配和反向最大匹配两种策略: 1. 正向最大匹配:从字符串的起始位置开始,尝试匹配尽可能长的已知词或模式。如果当前位置无法匹配到任何已知词,就退回到下一个字符,继续尝试。 2. 反向最大匹配:...

    基于词典的最大匹配的Lucene中文分词程序

    这种方法可以分为正向最大匹配和反向最大匹配: 1. 正向最大匹配:从左到右扫描文本,每次尝试匹配词典中最长的词,直到无法匹配为止,然后退一步再尝试次长的词,以此类推。 2. 反向最大匹配:从右到左扫描,也是...

    递归最大匹配法

    双向最大匹配法,即BMES算法(Begin, Middle, End, Single),是从正向和反向两个方向对文本进行最大匹配,以找到最长的合法词语。然而,这种方法可能会在某些情况下导致分词不准确或效率较低。例如,对于句子"一千...

    基于Python实现一个微型的中文分词器【100012305】

    一个微型的中文分词器,目前提供了以下几种分词算法: 按照词语的频率(概率)来利用构建 DAG(有向无环图)来分词,使用 Trie Tree 构建前缀字典树 使用隐马尔可夫模型(Hidden Markov Model,HMM)来分词 融合 DAG...

    中科院分词软件_JAVA版本

    分词的算法分词算法采用的是最大匹配算法,按从左至右正向最大匹配和从右到左反向最大匹配,当两种分词结果不一致时,按最少切分原则

    中文分词程序Python版

    正向最大匹配(Forward Maximum Matching,FMM)是一种常用的分词算法,它从句子的起始位置开始,每次选取最长的可能词汇,直到处理完所有字符。以下是对这个Python实现的中文分词程序及其相关知识点的详细说明。 ...

Global site tag (gtag.js) - Google Analytics