逆向最大匹配分词算法C#

逆向顺序

句子:大家好我叫XX我是一名程序员

程序员  ->  序员  ->  员

名程序  ->  程序  ->  序

一名程  ->  名程  ->  程

是一名  ->  一名  ->  名

我是一  ->  是一  ->  一

X我是   ->  我是  ->  是

XX我    ->  X我  ->  我

叫XX    ->  XX   ->  X

我叫X   ->  叫X  ->  X

好我叫  ->  我叫  ->  叫

家好我  ->  好我  ->  我

大家好  ->  家好  ->  好

大家     ->  家

class Program
    {
        public static HashSet<string> dictionary = new HashSet<string>();

        static void Main(string[] args)
        {
            Initail();
            List<string> list = new List<string>();
            string s = "大家好我叫XX我是一名程序员";
            string[] sentences = s.Split(‘,‘);
            int max = 3;
            for (int i = 0; i < sentences.Length; i++)
            {
                string str = sentences[i];
                int start = sentences[i].Length - max;
                int len = sentences[i].Length - start;
                while (len > 0)
                {
                    string subWord = sentences[i].Substring((start < 0 ? 0 : start), len);
                    Console.WriteLine(subWord);
                    if (Search(subWord))
                    {
                        list.Add(subWord);
                        start = start - max;
                        if (start < 0)
                        {
                            len = start < 0 ? max + start : max;
                        }
                    }
                    else
                    {
                        int k = 1;
                        bool flag = false;
                        string tempWord = null;
                        for (; k <= subWord.Length - 1; k++)
                        {
                            tempWord = subWord.Substring(k);
                            Console.WriteLine(tempWord);
                            if (Search(tempWord))
                            {
                                flag = true;
                                list.Add(tempWord);
                                break;
                            }
                        }
                        if (flag)
                        {
                            start = start - tempWord.Length;
                        }
                        else
                        {
                            start--;
                        }
                        len = start < 0 ? max + start : max;
                    }
                }
            }
            foreach (string x in list)
            {
                Console.WriteLine(x);
            }
            Console.ReadKey();
        }

        public static void Initail()
        {
            dictionary.Add("大家");
            dictionary.Add("好");
            dictionary.Add("我");
            dictionary.Add("一名");
            dictionary.Add("程序员");
            dictionary.Add("nick");
        }

        public static bool Search(string word)
        {
            return dictionary.Contains(word);
        }
    }

时间: 2024-10-05 11:07:18

逆向最大匹配分词算法C#的相关文章

最大匹配分词算法

全文检索有两个重要的过程: 1分词   2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词. 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词.这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中 A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度.用概率分词的好 处是不需要借助词典的帮助,坏处是算法比较麻烦,效率不高,也存在一定的出错率

自然语言处理 最大逆向匹配分词算法

输入例句:S1="计算语言学课程有意思" : 定义:最大词长MaxLen = 5:S2= " ":分隔符 = “/”: 假设存在词表:…,计算语言学,课程,意思,…: 最大逆向匹配分词算法过程如下: (1)S2="":S1不为空,从S1右边取出候选子串W="课程有意思": (2)查词表,W不在词表中,将W最左边一个字去掉,得到W="程有意思": (3)查词表,W不在词表中,将W最左边一个字去掉,得到W=&q

。一个最大逆向匹配分词算法的例子

原文链接地址:http://www.52nlp.cn/maximum-matching-method-of-chinese-word-segmentation/ 逆向匹配法思想与正向一样,只是从右向左切分,这里举一个例子: 输入例句:S1=”计算语言学课程有意思” : 定义:最大词长MaxLen = 5:S2= ” “:分隔符 = “/”: 假设存在词表:…,计算语言学,课程,意思,…: 最大逆向匹配分词算法过程如下: (1)S2=””:S1不为空,从S1右边取出候选子串W=”课程有意思”: (

双向最大匹配分词算法

#!/usr/bin/python #encoding=gbk import sys dictMaxLength = 5 dctDict = {} encoding='gbk' ''' 初始化字典.初始化最大词长 ''' def initDct(dct): global dctDict global dictMaxLength dctobj = open(dct) for line in dctobj: line = line.strip() word = line.split("\t"

中文分词--逆向最大匹配

上一篇文章中介绍了正向最大匹配,可以看到有时候效果不是很好,这里在介绍一种逆向最大匹配的算法.词典和匹配的字符串都和上一篇文章相同 只是本算法是从后到前搜索字符串,然后找到最长的匹配结果输出.上代码 package com; import java.util.ArrayList; import java.util.List; public class Segmentation1 { private List<String> dictionary = new ArrayList<Strin

中文分词常用算法之基于词典的逆向最大匹配

算法描述: S1为带切分字符串,S2为空,MaxLen为词典中的最大词长 判断S1是否为空,若是则输出S2 从S1右边开始,取出待处理字符串str(其中str的长度小于MaxLen) 查看str是否在词典中,若是则转5,若否则转6 S2+=str+”/”,S1-=str,转2 将str最左边的一个字去掉 判断str是否为单字,若是则转5,若否则转4 Java实现代码: 1 public static List<String> BMM(String text) { 2 Stack<Stri

分词算法-正向最大匹配算法与逆向最大匹配算法

这两种分词方法都是机械分词方法,按照一定的策略将待分析的汉字串与机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功.按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配.按照不同长度优先匹配的情况,可以分为最大匹配和最小匹配.由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少用.一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少.统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245.但这种精度还远远不能满足实际

NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

最近接触NLP中文分词, 在lunr.js的基础上, 实现了中文的最大正向匹配分词. 某些情况下, 我们在服务器端进行中文文本分词可以使用完整的基于mmseg算法的分词模块, 例如nodejieba, node-segment, 盘古分词等等,  但是在客户端环境下, 我们不能使用这些复杂的分词算法进行分词, 这个时候可以根据已经生成的索引进行简单的客户端分词, 就是所说的FMM (Forward Maximum Matching, 正向最大匹配), 有时候也可以使用正向匹配. 在做FMM的时候

内容关键词布局进阶:了解搜索引擎分词算法

首先,中文和英文不同的是,英文单词之间有空格,而中文都是连贯在一起来操作的,在形式上,无法做出区分.所以中文文本在进行网页分析之前,需要将文本切分为多个词或者字.在目前检索中,主要可以分为按字检索和按词检索,其中按词检索,拥有更快的速度和较高的准确性. 自动分词系统算法介绍 分词系统基本方法:基于字符串匹配的分词方法和基于统计的分词方法. 3-1)基于字符串匹配:也称为机械分词,按照几个既定的策略,将等待分析的字符串和一个容量足够大的词典中的词条进行匹配,若在词典中找到同样的一个字符串,那么匹配