`
hermitte
  • 浏览: 30313 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

一段没有空格的中英文分词的n-gram算法实现

阅读更多
我刚写过个C#的实现。用的N-Gram算法很简单的。也能解决楼上的朋友的问题就是第一个单词和往后数8个单词的排列组合的取最大概率值得时候,把第一位的单词作为分词的结果,然后分词窗口后移,继续下一步。用堆栈作的 等下我给你找找,算法部分直接就可以在java下面Ctrl+C了。。 我开发项目用java,作数据挖掘和商业算法研究用C#的
c# 代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.Collections;   
  5. using System.IO;   
  6.   
  7. namespace HNOZ   
  8. {   
  9.     class Program   
  10.     {   
  11.   
  12.   
  13.         static double UNKNOWN = 0.05F;   
  14.         static int pt = 0;   
  15.   
  16.         static int PRE_LENGTH =8;   
  17.         static int FL_LENGTH = 8;   
  18.         static int fl = FL_LENGTH;   
  19.         static int pre = PRE_LENGTH;   
  20.         static string sentence = "goodmorningbetterhello";   
  21.         static Hashtable dict = new Hashtable();   
  22.         static void Init()   
  23.         {   
  24.   
  25.         }   
  26.         static void Main(string[] args)   
  27.         {   
  28.             Hashtable ht = new Hashtable();   
  29.             // sentence = "欧美的政治上的保守党派确实经济上的自由主义鼓吹者欧美欧美的政治上的保守党派确实经济上欧美的政治上的保守党派确实经济上的自由主义鼓吹者欧美欧美的政治上的保守党派确实经济上";   
  30.             //string sentence = "欧美的政治上的保守党派确实经";   
  31.             string sentence = "goodmorningbetterhello";   
  32.   
  33.   
  34.             FileStream fs = new FileStream("11.csv", FileMode.Open);   
  35.             StreamReader sr = new StreamReader(fs);   
  36.             string line = "";   
  37.             string hz = "";   
  38.             string gl = "";   
  39.             dict.Add("", 0.00);   
  40.             while ((line = sr.ReadLine()) != null)   
  41.             {   
  42.                 int i = line.IndexOf(',');   
  43.                 hz = line.Substring(0, i);   
  44.                 gl = line.Substring(i + 1, line.Length - i - 1);   
  45.                 if (!hz.Equals("?"))   
  46.                     dict.Add(hz, double.Parse(gl));   
  47.             }   
  48.             int start = 0;   
  49.             //dict = ht;   
  50.             //string aa = Console.ReadLine();   
  51.             Console.WriteLine(analyse(sentence, start));   
  52.             string e = Console.ReadLine();   
  53.             start = 0;   
  54.             Console.WriteLine(analyse(e, start));   
  55.             Console.WriteLine(analyse(sentence, start));   
  56.   
  57.   
  58.   
  59.         }   
  60.         static string analyse(string sentence, int start)   
  61.         {   
  62.             string results = "";   
  63.             string nowstr = "";   
  64.             int pos = 0;   
  65.             int len = 0;   
  66.             double max = 0;   
  67.             double now = 0;   
  68.   
  69.             while (start < sentence.Length)   
  70.             {   
  71.                 nowstr = Split(sentence.Substring(start, sentence.Length - start));   
  72.   
  73.   
  74.   
  75.   
  76.                 start = start + nowstr.Length;   
  77.                 results += nowstr + "/";   
  78.             }   
  79.             return results;   
  80.         }   
  81.   
  82.   
  83.   
  84.         static string Split(string sentence)   
  85.         {   
  86.             int m = 0;   
  87.             int result = 0;   
  88.             double now = 0;   
  89.             double p = 0;   
  90.             int pos = 0;   
  91.             double max = 0;   
  92.             int j = 1;   
  93.             string curWord = "";   
  94.             int i = 1;   
  95.             int len = 0;   
  96.             int[] oj = new int[PRE_LENGTH];   
  97.             if (sentence.Length < PRE_LENGTH)   
  98.             {   
  99.   
  100.                 fl = sentence.Length + 1;   
  101.                 pre = sentence.Length + 1;   
  102.   
  103.             }   
  104.             else  
  105.             {   
  106.                 fl = FL_LENGTH;   
  107.                 pre = PRE_LENGTH;   
  108.   
  109.   
  110.             }   
  111.             while (i < pre)   
  112.             {   
  113.   
  114.                 while (j < fl)   
  115.                 {   
  116.                     oj[i] = j;   
  117.                     pos = 0;   
  118.                     for (int k = 1; k < i; k++)   
  119.                     {   
  120.                         pos = pos + oj[k];   
  121.   
  122.                     }   
  123.                     if (pos + j > sentence.Length)   
  124.                     {   
  125.   
  126.                         curWord = "";   
  127.                     }   
  128.                     else  
  129.                     {   
  130.   
  131.                         len = j;   
  132.                         curWord = sentence.Substring(pos, len);   
  133.                     }   
  134.   
  135.                     if (dict[curWord] != null)   
  136.                     {   
  137.                         p = (double)dict[curWord];   
  138.                     }   
  139.                     else  
  140.                     {   
  141.                         j++;   
  142.                         continue;   
  143.                     }   
  144.                     if (i == pre - 1)   
  145.                     {   
  146.                         if (p + now > max)   
  147.                         {   
  148.                             result = oj[1];   
  149.                             max = p + now;   
  150.                         }   
  151.                         else  
  152.                         {   
  153.   
  154.   
  155.                         }   
  156.   
  157.                         j++;   
  158.   
  159.   
  160.                     }   
  161.                     else  
  162.                     {   
  163.                         now = now + p;   
  164.                         i++;   
  165.                         j = 1;   
  166.                     }   
  167.   
  168.   
  169.   
  170.                     //  j++;   
  171.   
  172.                 }   
  173.   
  174.                 j = oj[i - 1];   
  175.                 oj[i] = 0;   
  176.                 j++;   
  177.                 i--;   
  178.   
  179.                 if (j == 1 && i == 0)   
  180.                     break;   
  181.   
  182.   
  183.   
  184.             }   
  185.   
  186.   
  187.   
  188.   
  189.   
  190.   
  191.   
  192.   
  193.             return sentence.Substring(0, result);   
  194.   
  195.         }   
  196.   
  197.     }   
  198. }   
分享到:
评论

相关推荐

    只针对中英文混合分词的中文分词器

    《只针对中英文混合分词的中文分词器》 在中文信息处理领域,分词是文本预处理的重要环节,其目的是将连续的文本序列按照词汇边界进行划分,以得到独立的词语。对于中英文混合的文本,分词任务更具挑战性,因为它...

    fenCi.rar_fenci _fenci.rar_中文信息处理_分词 java_分词算法

    这是因为中文没有像英文那样的空格或标点符号来自然地划分单词边界,因此需要借助分词系统来完成这一任务。 在“fenCi.rar”中,包含的两个主要部分是“fenCi”和“www.pudn.com.txt”。前者可能是一个实现了分词...

    php实现的完整中文分词类

    由于中文没有明显的空格分隔,所以分词相对英文而言更为复杂。 在PHP中实现中文分词,我们通常需要借助字典库和正则表达式。字典库包含大量常用词汇,用于判断连续的汉字序列是否为合法的词语。正则表达式则用于...

    大学生自然语言处理复习期末题目

    5、中文分词与英文分词的主要区别在于,中文分词需要解决词语边界的问题,因为中文词汇之间没有明显的分隔符,而英文词汇通常以空格分隔。此外,中文分词面临的挑战有切分歧义和未登录词识别,比如“苹果”可以是...

    最大概率分词法 搜索引擎 分词

    对于中文,由于没有明显的空格分隔,分词更为复杂,往往需要结合词典和统计方法共同完成。 在实际应用中,分词系统的性能受到以下几个关键因素的影响: 1. 词典:包含大量词汇及其属性的数据库,为分词提供基础参考...

    中文分词C#

    由于中文没有像英文那样的空格或标点符号来自然地分隔单词,因此需要特定的算法来识别词语边界。常见的分词算法有基于词典的匹配法(如正向最大匹配、逆向最大匹配)、统计模型(如隐马尔可夫模型HMM、条件随机场CRF...

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

    由于中文没有像英文那样的空格或标点符号作为明显的词边界,因此中文分词显得尤为复杂。 Lucene是一个流行的全文检索库,由Apache软件基金会开发,它提供了一个强大的索引和搜索功能。在处理中文文档时,Lucene需要...

    分词器LUcene

    在中文环境中,由于没有明显的空格分隔,分词更具挑战性。Lucene通过内置的IK分词器、SmartChinese分词器等,提供了高效且准确的中文分词解决方案。 接下来,我们关注的是分词歧义处理。在中文分词中,常常会出现一...

    基于类别特征向量表示的中文文本分类算法

    对于英文文本分类而言,由于单词间有空格分隔,可以直接以词为单位生成文本特征,特征抽取过程较为简单。相比之下,中文文本不具备这种天然的分隔符,因此如何有效地生成文本特征成为中文文本分类面临的首要问题。...

    CRF++ 训练中文分词

    在中文分词中,由于中文没有明显的词边界,如英文中的空格,因此需要通过算法来识别词语的边界。CRF++提供了一个灵活的框架,允许用户自定义特征模板,以便在训练过程中捕捉到文本序列中的各种模式。 描述中提到的...

    自然语言处理(NLP)分词器

    Word(词):最自然的语言单元,对于英文等自然语言来说,存在着天然的分隔符(如空格或标点符号),但对于中文等东亚文字,则需要使用分词算法。 Char(字符):词汇表中只有最基本的字符。字符数量有限,但为每个...

    java分词源码

    分词在中文处理中至关重要,因为中文句子没有像英文那样的空格或标点来明确区分单词。Java分词程序通常会采用基于词典的分词方法,即通过预先构建的词典来匹配输入文本中的词汇。SDIC.txt可能是这个分词程序的词典...

    中文分词中基于主动学习的领域自适应方法

    由于中文文本不像英文那样具有明显的单词分隔符(如空格),因此中文分词尤为重要,它是中文信息处理中的关键技术之一。随着人工智能技术的发展,基于统计的中文分词方法逐渐成为主流,这类方法主要包括基于隐...

    携程chenjiaci_words.txt

    1. 分词的必要性:在中文中,单词之间没有明显的分隔,如英文中的空格,所以需要分词技术来识别单词的边界,以便进一步进行语言处理。 2. 分词技术应用:分词技术广泛应用于搜索引擎、机器翻译、文本挖掘、信息检索...

    ch07 词法分析.pdf

    本章还提到了利用各种机器学习算法,如N-Gram、HMM(隐马尔可夫模型)、CRF(条件随机场)、SVM(支持向量机)和深度学习方法,来解决分词问题,这些算法能够处理复杂的数据模式,提高分词的准确性和效率。...

    word_frequency-master.zip_词频统计_词频统计C

    词频统计是文本分析中的一个基础任务,它用于计算在给定文本中每个单词出现的次数,以便了解文本的...对于有一定经验的开发者,这个项目也可以作为一个起点,探索更复杂的数据分析方法,比如N-gram分析、TF-IDF计算等。

    人民日报语料

    中文分词是中文处理中的基础步骤,它将连续的汉字序列切分成一个个有意义的词汇单位,因为中文没有像英文那样的空格或标点符号来自然地划分单词边界。这一过程对于后续的语义分析、情感分析、机器翻译等任务至关重要...

    自然语言处理系列:中文维基语料词向量训练.pdf

    2. 分词:中文文本与英文不同,没有空格作为天然的分隔符,因此中文分词是中文自然语言处理的重要步骤之一。分词指的是将连续的文本切分成有意义的词序列的过程。在本文件中提到的中文维基语料分词,通常需要利用...

    基于词典方法和机基于器学习方法的中文情感倾向分析(Web).zip

    在中文文本处理中,分词是必要的预处理步骤,因为它没有明显的空格分隔。分词工具如jieba用于将句子切分成单个词汇。词性标注进一步帮助识别词汇的语法角色,有时会影响其情感极性。 #### 3. 情感得分计算 每个词汇...

    lucene中文搜索

    对于未在词典中出现的新词,分词器通常会采取一些策略,如基于n-gram的方法,来尝试进行分词。 3. **关键词标准化(Stemming)**: 在英文中,关键词标准化通常涉及词干提取或词形还原。中文虽然没有明确的词尾变化...

Global site tag (gtag.js) - Google Analytics