由隐马尔科夫意淫无字典中文分词 C#

using System;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;

namespace HMM
{
    public partial class Form1 : Form
    {
        string[] arrayData;
        DirectoryInfo di;
        FileInfo[] fis;
        Hashtable htDict = new Hashtable();
        double singleCutRate;

        public Form1()
        {
            InitializeComponent();
            label1.Text = "先预处理!";
            progressBar1.Visible = false;
            di = new DirectoryInfo("data");
            fis = di.GetFiles("*.txt");
            arrayData = new string[fis.Length];
            if (!double.TryParse(textBox3.Text.Trim(), out singleCutRate))
            {
                singleCutRate = 0.05;
            }
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            this.Width = 800;
            this.Height = 600;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (!new FileInfo("dict.txt").Exists)
            {
                int count = 0;
                progressBar1.Visible = true;
                BackgroundWorker worker = new BackgroundWorker();
                worker.WorkerReportsProgress = true;  //报告进度
                worker.DoWork += (s, o) =>
                {
                    int progressCount = 1;
                    foreach (FileInfo i in fis)
                    {
                        StreamReader sr = new StreamReader(i.FullName, System.Text.Encoding.Default);
                        arrayData[progressCount - 1] = sr.ReadToEnd();
                        sr.Close();
                        worker.ReportProgress((int)((double)progressCount / (double)fis.Length * 33), null);
                        progressCount++;
                    }
                    for (int i = 0; i < arrayData.Length; i++)
                    {
                        arrayData[i] = Regex.Replace(arrayData[i], @"[^\u4e00-\u9fa5]", "");
                        for (int j = 0; j < arrayData[i].Length; j++)
                        {
                            string strWord = arrayData[i].Substring(j, 1);
                            if (IsChinese(strWord))
                            {
                                if (htDict.ContainsKey(strWord))
                                {
                                    htDict[strWord] = ((int)htDict[strWord]) + 1;
                                }
                                else
                                {
                                    htDict.Add(strWord, 1);
                                }
                            }
                        }
                        worker.ReportProgress((int)((double)i / (double)arrayData.Length * 33) + 33, null);
                    }
                    StreamWriter sw = new StreamWriter("dict.txt", false, System.Text.Encoding.Default);
                    foreach (DictionaryEntry i in htDict)
                    {
                        sw.WriteLine(i.Key + "|" + i.Value);
                        count++;
                        sw.Flush();
                        worker.ReportProgress((int)((double)count / (double)htDict.Count * 33) + 67, null);
                    }
                    sw.Close();
                };
                worker.RunWorkerCompleted += (s, o) =>
                {
                    this.Invoke(new MethodInvoker(() => { progressBar1.Visible = false; progressBar1.Value = 0; label1.Text = "预处理完成!|" + count; }));
                };
                worker.ProgressChanged += (s, o) =>
                {
                    progressBar1.Style = ProgressBarStyle.Continuous;
                    progressBar1.Value = o.ProgressPercentage;
                };
                worker.RunWorkerAsync();
            }
            else
            {
                int count = 0;
                progressBar1.Visible = true;
                BackgroundWorker worker = new BackgroundWorker();
                worker.WorkerReportsProgress = true;  //报告进度
                worker.DoWork += (s, o) =>
                {
                    int progressCount = 1;
                    foreach (FileInfo i in fis)
                    {
                        StreamReader sr = new StreamReader(i.FullName, System.Text.Encoding.Default);
                        arrayData[progressCount - 1] = sr.ReadToEnd();
                        sr.Close();
                        worker.ReportProgress((int)((double)progressCount / (double)fis.Length * 33), null);
                        progressCount++;
                    }
                    for (int i = 0; i < arrayData.Length; i++)
                    {
                        arrayData[i] = Regex.Replace(arrayData[i], @"[^\u4e00-\u9fa5]", "");
                        worker.ReportProgress((int)((double)i / (double)arrayData.Length * 33) + 33, null);
                    }
                    StreamReader reader = new StreamReader("dict.txt", System.Text.Encoding.Default);
                    string line = "";
                    while ((line = reader.ReadLine()) != null)
                    {
                        htDict[line.Substring(0, 1)] = line.Substring(2);
                        count++;
                    }
                    reader.Close();
                    worker.ReportProgress(100, null);
                };
                worker.RunWorkerCompleted += (s, o) =>
                {
                    this.Invoke(new MethodInvoker(() => { progressBar1.Visible = false; progressBar1.Value = 0; label1.Text = "预处理完成!|" + count; }));
                };
                worker.ProgressChanged += (s, o) =>
                {
                    progressBar1.Style = ProgressBarStyle.Continuous;
                    progressBar1.Value = o.ProgressPercentage;
                };
                worker.RunWorkerAsync();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (label1.Text != "先预处理!" && textBox1.Text.Trim() != "")
            {
                List<string> list = new List<string>();
                string strSplitWords = Regex.Replace(textBox1.Text.Trim(), @"[^\u4e00-\u9fa5]", "");
                int startPos = 0;
                int m = 1;
                string strWord1 = "";
                string strWord2 = "";
                progressBar1.Visible = true;
                BackgroundWorker worker = new BackgroundWorker();
                worker.WorkerReportsProgress = true;  //报告进度
                worker.DoWork += (s, o) =>
                {
                    while (strSplitWords.Length >= 2)
                    {
                        if (strWord1 == "")
                        {
                            strWord1 = strSplitWords.Substring(startPos, m);
                        }
                        strWord2 = strSplitWords.Substring(startPos, ++m);
                        double x1 = (double)ReturnCount(strWord1, arrayData);
                        double y1 = (double)ReturnTotalCount(strWord1);
                        if (y1 == 0)
                            y1++;
                        double a = x1 / y1;
                        double x2 = (double)ReturnCount(strWord2, arrayData);
                        double y2 = (double)ReturnTotalCount(strWord2);
                        if (y2 == 0)
                            y2++;
                        double b = x2 / y2;
                        if ((a < 1 && a > b) || (a == 1 && b < singleCutRate) || (a == 0 && b == 0))
                        {
                            list.Add(strWord1);
                            startPos += strWord1.Length;
                            worker.ReportProgress((int)((double)startPos / (double)strSplitWords.Length * 100), null);
                            m = 1;
                            strWord1 = "";
                            strWord2 = "";
                            if ((strSplitWords.Length - startPos) == 1)
                            {
                                list.Add(strSplitWords.Substring(startPos, 1));
                                break;
                            }
                            else if ((strSplitWords.Length - startPos) < 1)
                            {
                                break;
                            }
                        }
                        else
                        {
                            strWord1 = strWord2;
                            strWord2 = "";
                            if ((strSplitWords.Length - startPos - m) < 1)
                            {
                                list.Add(strWord1);
                                startPos += strWord1.Length;
                                worker.ReportProgress((int)((double)startPos / (double)strSplitWords.Length * 100), null);
                                break;
                            }
                        }
                    }
                    worker.ReportProgress(100, null);
                };
                worker.RunWorkerCompleted += (s, o) =>
         {
             this.Invoke(new MethodInvoker(() =>
             {
                 progressBar1.Visible = false;
                 progressBar1.Value = 0;
                 foreach (string i in list)
                 {
                     textBox2.Text += i + "|";
                 }
                 label2.Text = "分词完成!";
             }));
         };
                worker.ProgressChanged += (s, o) =>
                {
                    progressBar1.Style = ProgressBarStyle.Continuous;
                    progressBar1.Value = o.ProgressPercentage;
                };
                worker.RunWorkerAsync();
            }
        }

        public bool IsChinese(string str)
        {
            return Regex.IsMatch(str, @"^[\u4e00-\u9fa5]+$");
        }

        public int ReturnCount(string s, string[] d)
        {
            int count = 0;
            for (int i = 0; i < d.Length; i++)
            {
                int pos = 0;
                while (true)
                {
                    pos = d[i].IndexOf(s, pos);
                    if (pos != -1)
                    {
                        pos++;
                        count++;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return count;
        }

        public int ReturnTotalCount(string s)
        {
            int total = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (htDict.ContainsKey(s.Substring(i, 1)))
                {
                    total += Convert.ToInt32(htDict[s.Substring(i, 1)]);
                }
            }
            return total;
        }
    }
}

最近在看机器学习方面的书,看到隐马尔科夫,意淫了一下无字典中文分词的可能性,我设想了一种分词方式,并无聊了一个程序,因为执行效率相当差,所以添加了进度条,否则真的等到受不了,仅供参考

1、下载了3200本各类电子书,600多M

2、预先扫描每个字出现的概率P(w)

3、清除待分词内容c中非中文字符

4、从左向右扫描ci,(i为字数,每一位为w1、w2、w3.....wi),

开始时:计算第一个字c1的a=P(c1)/P(w1)和前两个字c2的b=P(c2)/(P(w1)+P(w2))

comp:if ((a < 1 && a > b) || (a == 1 && b < singleCutRate) || (a == 0 && b == 0))

则分割c1,指针前后移动i

否则继续比较
前两个字 a=P(c2)/(P(w1)+P(w2))

和前三个字  b=P(c3)/(P(w1)+P(w2)+P(w3)) 的大小
 循环到comp

注意检测c的尾部并及时跳出循环,singleCutRate用于估算单字的切割概率,比如

“中” 和 “中国” ,当 P(中国)/(P(中)+P(国)) >=0.05 认为“中国”是固有词汇,否则直接分割“中”,这个切割概率需要调教一个合理的数值。

yy完毕!

时间: 2024-10-09 14:25:21

由隐马尔科夫意淫无字典中文分词 C#的相关文章

隐马尔科夫模型—2

二 定义 (1) 基本定义 在上一篇中,我们通过一个给母亲打电话预测天气的例子,来引入隐马尔科夫模型.下面我们将结合一中的例子来形式化的定义隐马尔可夫模型.隐马尔科夫模型是关于时序的概率模型,描述的由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程.在我们这个例子中,就是由一个隐藏的马尔科夫链生成每天的天气(状态),再由每天的天气决定每天母亲下班以后做什么(观测)的随机过程.隐藏的马尔科夫链随机生成的状态的序列,称为状态序列,也就是最近一段时间

隐马尔科夫模型

特征向量:跟踪框位置相对轨迹中心的比值,角度,速度. 马尔科夫模型: State Sequence, q1 q2 ...... qT t个状态之间的转移可见,则这个时间序列的概率是πq1 × aq1q2 × ...... × aqT-1qT 隐马尔科夫模型: 状态不可见(隐藏),只能从观察值推测出,所以由观察值推测该时刻的状态有个观察值概率b. πq1 × bq1( o1 ) × aq1q2 × bq2( o2 ) × ...... × aqT-1qT × bqT( oT ), 三个问题: 1.

HMM基本原理及其实现(隐马尔科夫模型)

HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态参数都离散的马尔可夫过程.HMM是在Markov链的基础上发展起来的,由于实际问题比Markov链模型所描述的更为复杂,观察到的时间并不是与状态一一对应的,而是通过一组概率分布相联系,这样的模型称为HMM.HMM是双重随机过程:其中之一是Markov链,这是基本随机过程,它描述状态的转移,是隐含的.

隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到.在李航的<统计学习方法>中,这个算法的讲解只考虑了单个观测

炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!

高温天气与行为概率 夏季是一年最热的时候,气温普遍偏高,一般把日最高气温达到35℃以上的天气叫作高温天气,但是一般情况下高温天气分为两类.  (1)干热型高温.一般是指气温较高.太阳辐射强而且空气的湿度较小的高温天气.  (2)闷热型高温.一般是指水汽丰富,但是气温相对而言并不算太高,给人感受闷热.  小张在不同类型下的高温天气下会有不同的行为,但是归纳起来为主要为散步.垂钓.看书三类,分别在干热型高温和闷热型高温下对应行为的概率见下表.  假设干热型高温和闷热型高温之间会进行相互转变,每天可能

七月算法-12月机器学习在线班--第十七次课笔记-隐马尔科夫模型HMM

七月算法-12月机器学习--第十七次课笔记-隐马尔科夫模型HMM 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 隐马尔科夫模型 三个部分:概率计算,参数估计,模型预测 1,HMM定义 HMM由初始概率分布π.状态转移概率分布A以及观测概率分布B确定. Eg:以中文分词为例子 隐状态为="2",是不是终止字,是/否?(Y/N)即是不是最后一个字. A矩阵:第一个:当前是终止字,下一个也是终止字的概率 B是当前的隐状态是终止词,

隐马尔科夫模型HMM

隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程.其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析.在早些年HMM模型被非常广泛的应用,而现在随着机器学习的发展HMM模型的应用场景越来越小然而在图像识别等领域HMM依然起着重要的作用. 引言: 隐马尔科夫模型是马尔科夫链的一种,它

隐马尔科夫模型python实现简单拼音输入法

在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此训练得出隐马尔科夫模型,用维特比算法实现了一个简单的拼音输入法.githuh地址:https://github.com/LiuRoy/Pinyin_Demo 原理简介 隐马尔科夫模型 抄一段网上的定义: 隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含

隐马尔科夫模型(HMM)

HMM简介 HMM用于研究非确定性生成模式,HMM是一个与时间无关的模型(有待改进),并且n阶HMM模型是指下一个状态只与前n个有关,通常只研究一阶HMM模型(有待改进).从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析,例如模式识别. 下面可以使用一个案例来解释HMM模型. 假设有三种色子,分别是标有123456的立方体.标有1234的三菱锥.标有12345678的八面体.它们分别记为D6.D4.D8,假设我们从三个色子中任意挑一个色子的概率为1/3,然后我们可以随意掷色