加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Visual C#中匹配字符串中的字符

发布时间:2020-12-16 01:51:47 所属栏目:百科 来源:网络整理
导读:我正在研究视觉C# 计算单词错误率 我有一个文本框用于参考,这是正确的信号 而一个假设是错误的. 为了计算WER,我需要计算: 替换:已经改变的词,这是我的第一个问题 插入:插入句子中的单词 已删除:已从原始句子中删除的单词 对于EX: 参考:这是一个不良贷
我正在研究视觉C#
计算单词错误率
我有一个文本框用于参考,这是正确的信号
而一个假设是错误的.

为了计算WER,我需要计算:
替换:已经改变的词,这是我的第一个问题
插入:插入句子中的单词
已删除:已从原始句子中删除的单词

对于EX:

参考:这是一个不良贷款计划.
假设:这是一个不太酷的.

它:替代
是正确的
?an:替代
NPL:正确
?程序:已删除
酷:插入

我尝试了dasblinkenlight提出的算法(非常感谢你的方式)
我工作但是有一个运行时错误我无法理解,排成一行

int x=  Compute(buffer[j],buffer_ref[i]);

指数数组的边界之外.

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string [] hyp = new string[20];
        string [] refrence = new string[20];
        string [] Anser= new string[20];
        string[] buffer = new string[20];
        string[] buffer_ref = new string[20];
        int count = 0; // number of words 
        string ref2=" " ;
        string hyp2 = " ";
        string Anser2 = " ";
        string buffer2 = " ";

        int corecct_c=0;
        int corecct_d = 0;
        int corecct_i = 0;

        //====================================================================

        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i <= 19; ++i)
            {
                hyp[i] = null;
                buffer[i] = null;
            }
        }

        private void textBox2_TextChanged(object sender,EventArgs e)
        {
            refrence = this.textBox2.Text.Split(' ');
            buffer_ref = this.textBox2.Text.Split(' ');


        }

        private void textBox1_TextChanged(object sender,EventArgs e)
        {
            hyp = this.textBox1.Text.Split(' ');
            buffer = this.textBox1.Text.Split(' ');
            //hyp = this.textBox1.Text;
            // fname1.Add(this.textBox1.Text);


        }

        public void correct(string[] R)
        {

            for (int i = 0; (i <= 19) && (R[i] != "."); ++i)
            {

                if (buffer[i] == refrence[i])
                { buffer[i] = "0";
                buffer_ref[i] = "0";
                    corecct_c = corecct_c + 1;
                    Anser[i] = "C";
                }
            }

        }

        // function that compute 2 strings
        public static int Compute(string s,string t)
        {
            int n = s.Length;
            int m = t.Length;
            int[,] d = new int[n + 1,m + 1];

            // Step 1
            if (n == 0)
            {
                return m;
            }

            if (m == 0)
            {
                return n;
            }

            // Step 2
            for (int i = 0; i <= n; d[i,0] = i++)
            {
            }

            for (int j = 0; j <= m; d[0,j] = j++)
            {
            }

            // Step 3
            for (int i = 1; i <= n; i++)
            {
                //Step 4
                for (int j = 1; j <= m; j++)
                {
                    // Step 5
                    int cost = (t[j - 1] == s[i - 1]) ? 0 : 1;

                    // Step 6
                    d[i,j] = Math.Min(
                        Math.Min(d[i - 1,j] + 1,d[i,j - 1] + 1),d[i - 1,j - 1] + cost);
                }
            }
            // Step 7
            return d[n,m];
        }


        public void sub(){

            for (int j = 0;j<=19;j++) 
         {
             if (buffer[j].IndexOf("0") != -1)
             {


                 for (int i = 0; i <= 19; i++)
                 {

                     if (buffer_ref[j].IndexOf("0") != -1)
                     {

                       int x=  Compute(buffer[j],buffer_ref[i]);
                       if (x > 3)
                       {
                           buffer[j] = "0";
                           Anser[j] = "S";

                       }


                     }//end if

                 } 

             }//end if 


        }//end for 

        }// end fun

        private void button1_Click(object sender,EventArgs e)
        {


            correct(refrence);
            sub();
            for (int i = 0; (i <= 19) && (refrence[i] != "."); ++i)
            {
                //loop intialize 
                ref2 = ref2 + " " + refrence[i];
                hyp2 = hyp2 + " " + hyp[i];
                Anser2 = Anser2 + " " + Anser[i];
                buffer2 = buffer2 + " " + buffer[i];
                count++;
                            }

            listBox1.Items.Add(" Refrence :" + ref2);
            listBox1.Items.Add(" HYp :" + hyp2);
            listBox1.Items.Add(" Anser:" + Anser2);
            listBox1.Items.Add(" buffer:" + buffer2);
            listBox1.Items.Add(count);

        } 




        private void Form1_Load(object sender,EventArgs e)
        {

        }

        private void label1_Click(object sender,EventArgs e)
        {

        }



        private void button2_Click(object sender,EventArgs e)
        {

        }

        private void label2_Click(object sender,EventArgs e)
        {

        }

        private void listBox1_SelectedIndexChanged(object sender,EventArgs e)
        {

        }

    }
}

你能帮我吗 ?

解决方法

有一种内置的方法来测试两条线是否相同,但是没有内置的方法来判断两条线是否相似.您需要实现一种测量字符串相似性的算法,例如 Levenshtein Distance – 一种非常常见的 Edit Distance算法.具有较小编辑距离的行可以根据您的要求特定的阈值声明为相似.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读