C#最大逆向分词

C#中有丰富的类库,在汉字的处理问题上有较大的优势。

这次使用的是最大逆向分词,与昨天的正向分词,大同小异。点击打开链接

完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Collections;
namespace 最大逆向分词
{
    class Program
    {

        static void Main(string[] args)
        {
            string text = "";
            string path="E:\\data\\yuanwen.txt";
            FileStream fs = File.OpenRead(path);
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            text = text + sr.ReadLine();
            Console.WriteLine(text);
            sr.Close();
            fs.Close();//读取文本结束,以上
            char[] words = text.ToCharArray();//将文本放进数组
            int wholelen = words.Length;
            Console.WriteLine(wholelen);//数组的总长度为231,实际227字,说明空格被计入。
            string mystr;//用来分词
            OleDbConnection myconn = new OleDbConnection();
            OleDbCommand mycmd = new OleDbCommand();
            mystr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=words.mdb";
            myconn.ConnectionString = mystr;
            myconn.Open();
            mycmd.Connection = myconn;
            if (myconn.State == ConnectionState.Open)
                Console.WriteLine("已成功连入数据库");
            else
                Console.WriteLine("未成功连入数据库");//连入数据库,以上      
            string cutword = null,mysql,output=" ";
            int front = wholelen - 8, rear = wholelen, cutlen = 8,i=0;
            while(front>0)
            {
                while(front!=rear)
                {
                    cutword = null;
                    for(i=front;i<rear;i++)
                        cutword+=words[i];
                    mysql = "SELECT  word FROM words WHERE word='" + cutword + "'";
                    mycmd.CommandText = mysql;
                    if (mycmd.ExecuteScalar() != null)
                    {
                        break;//匹配成功,跳出减字的循环  
                    } 
                    front++;//匹配不成功,则继续减字  
                }
                
                output = output.Insert(0, cutword + "/");
                rear -= cutword.Length;
                front = rear - 8;
            }
            int n;
            cutword = null;      
            while(rear>0)
            {
               
                while(rear!=front)
                {
                    cutword = null;
                    for (n = front; n < rear; n++)
                        cutword += words[n];
                    mysql = "SELECT  word FROM words WHERE word='" + cutword + "'";
                    mycmd.CommandText = mysql;
                    if (mycmd.ExecuteScalar() != null)
                    {
                        break;//匹配成功,跳出减字的循环  
                    } front++;//匹配不成功,则继续减字  
                }
                
                output = output.Insert(0, cutword + "/");
                rear -= cutword.Length;
                front = 1;
            }
            Console.WriteLine(output);
        }
    }
}
输出



与正向分词的相同点:

①连入txt,access方法一样

②待切字段仍然用front,rear来标记

不同点:

①最开始rear标记的文章尾字,front标记的是rear前的第八个字。第一个切的字段为:“社会而努力奋斗。”与数据库匹配,不成功,front++,cutword变成“会而努力奋斗。”

继续匹配,不成功,再front++;直至切除一个词,或者cutword只剩一个字,这时候便要切下来。注意,这里使用了insert方法,来保证输出时不会是相反的文章顺序。

错误示范:/。/努力奋斗/而/小康社会/建成/全面/

这里的insert方法避免了上述现象的产生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lei_Baibai

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值