【问题标题】:How to convert the paragraph into root words如何将段落转换为词根
【发布时间】:2012-05-23 14:06:47
【问题描述】:

对不起,我正在尝试制作将单词转换为单词的简单应用程序。例如

启用 = 能够 付款 = 付款

我记事本上的文字是“启用支付”

我在上面使用了 2 个示例词,但我没有得到我需要的东西。我在 notepad.txt 上写了“启用”和“付款”。然后应用程序将启动并获取单词。

应用程序将开始修剪单词剪掉“En”和“ment”,这样它们的结果将是“able”和“pay”

我的应用程序可以将单个单词 "enable" 修剪为 "able" 。和“支付”到“支付”,但是,如果我写了 2 个或更多的词,例如“启用支付”或“支付启用”,应用程序就不能正常工作

这里是用户界面image

这里是源代码,

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;
using System.IO;

namespace KTM'
{
public partial class KTM : Form
{
    public string notepad;
    public KTM()
    {
        InitializeComponent();
        textBox1.Enabled=false;
        button2.Enabled = false;
        button3.Enabled = false;
    }

    void enable()
    {
        button2.Enabled = true;
        button3.Enabled = true;
    }
    private void button1_Click(object sender, EventArgs e)
    {

        string dir = Application.StartupPath.ToString();
        OpenFileDialog fdlg = new OpenFileDialog();
        fdlg.Title = "Open *txt files";
        fdlg.InitialDirectory = @dir;
        fdlg.Filter = "Text files (*.txt)|*.txt|Text Files (*.txt)|*.txt";
        fdlg.FilterIndex = 2;
        fdlg.RestoreDirectory = true;
        if (fdlg.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = fdlg.FileName;
        }
        else
        {

        }


      }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Equals(""))
        {

        }
        else
        {
            enable();
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        notepad = textBox1.Text;

        StreamReader sr = new StreamReader(notepad);
        string paragraf = sr.ReadToEnd();
        sr.Close();
        string[] kata = paragraf.Split(' ');
        int i = 0;

        //MessageBox.Show(kata[0]+" "+kata[1]+" "+kata[2]);
        foreach (string ambil in kata)
        {
            if (kata[i].StartsWith("en"))
            {
                kata[i] = kata[i].Substring(2);
            }
            if(kata[i].EndsWith("ment"))
            {
                int len = kata[i].Length;
                int kepake = len - 4;
                kata[i] = kata[i].Substring(0, kepake);
            }


        }
        i++;
        StreamWriter sw = new StreamWriter(notepad);
        i = 0;
        foreach (string ambil in kata)
        {
            sw.Write(kata[i]+" ");
        }
        i++;
        sw.Flush();
        sw.Close();




        MessageBox.Show("Converted and Saved  ","KTM Stemming",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        notepad = textBox1.Text;
        System.Diagnostics.Process.Start(notepad);
    }
}

}

【问题讨论】:

标签: c# string text split words


【解决方案1】:

您的 foreach 循环设计不正确。由于您要在循环内更新数组,因此最好使用迭代器进行简单的 for 循环:

    for (int i = 0; i < kata.Length; i++)
    {
        if (kata[i].StartsWith("en"))
        {
            kata[i] = kata[i].Substring(2);
        }
        if(kata[i].EndsWith("ment"))
        {
            int len = kata[i].Length;
            int kepake = len - 4;
            kata[i] = kata[i].Substring(0, kepake);
        }
    }

但是,在第二个循环中,foreach 是有意义的。不过,您需要使用 ambil 变量:

    foreach (string ambil in kata)
    {
        sw.Write(ambil + " ");
    }

编辑:

你说上面的方法行不通,但它对我有用。也许您的问题与表单中的其他一些代码有关。由于在同一方法中混合不同种类的逻辑并不是一个好习惯,我建议将根词解析逻辑分解为自己的方法,例如:

    private string getRootWords(string paragraf)
    {
        string[] kata = paragraf.Split(' ');
        for (int i = 0; i < kata.Length; i++)
        {
            if (kata[i].StartsWith("en"))
            {
                kata[i] = kata[i].Substring(2);
            }
            if (kata[i].EndsWith("ment"))
            {
                int len = kata[i].Length;
                int kepake = len - 4;
                kata[i] = kata[i].Substring(0, kepake);
            }
        }

        StringBuilder builder = new StringBuilder();
        foreach (string ambil in kata)
        {
            builder.Append(ambil + " ");
        }
        return builder.ToString();
    }

这种方法对我有用。当我打电话给getRootWords("Enable payment") 时,它会返回 `able pay',据我所知,这是您想要的输出。

【讨论】:

  • 它不工作,我不知道哪里出了问题,我第一次创建应用程序时,我使用上面显示的迭代,它不起作用,然后我尝试了 foreach,然后另一个显示令人困惑的逻辑:(
【解决方案2】:
    foreach (string ambil in kata)
    {
        if (kata[i].StartsWith("en"))
        {
            kata[i] = kata[i].Substring(2);
        }
        if(kata[i].EndsWith("ment"))
        {
            int len = kata[i].Length;
            int kepake = len - 4;
            kata[i] = kata[i].Substring(0, kepake);
        }


    }

这是您的问题的一部分,因为它是一个 foreach,但您正在像 for 循环一样使用它。您可能想要for (int i=0; i&lt;kata.Length; i++) 并且您正在写入for 循环之外的文件,因此您需要将您的文字放入该for 循环中,或者制作另一个for 循环。

【讨论】:

    【解决方案3】:

    您在循环外增加索引变量i,您应该在循环内增加它:

        foreach (string ambil in kata) 
        { 
            if (kata[i].StartsWith("en")) 
            { 
                kata[i] = kata[i].Substring(2); 
            } 
            if(kata[i].EndsWith("ment")) 
            { 
                int len = kata[i].Length; 
                int kepake = len - 4; 
                kata[i] = kata[i].Substring(0, kepake); 
            } 
            i++; 
        } 
    

    最好还是直接使用for 循环(你没有使用ambil 变量):

        for (i=0; i<kata.Lenght; i++) 
        { 
            if (kata[i].StartsWith("en")) 
            { 
                kata[i] = kata[i].Substring(2); 
            } 
            if(kata[i].EndsWith("ment")) 
            { 
                int len = kata[i].Length; 
                int kepake = len - 4; 
                kata[i] = kata[i].Substring(0, kepake); 
            } 
        } 
    

    【讨论】:

      【解决方案4】:

      谢谢你们的帮助! :) 我真的很感激,虽然我不明白一些答案 :D 至少你们帮我构建逻辑,我这样解决我的问题

       private void button2_Click(object sender, EventArgs e)
          {
              notepad = textBox1.Text;
      
              StreamReader sr = new StreamReader(notepad);
              string paragraf = sr.ReadToEnd();
              sr.Close();
              StreamWriter sw = new StreamWriter(notepad);
              string[] kata = paragraf.Split(' ');
      
              for (int i = 0; i < kata.Length; i++)
              {
                  if (kata[i].StartsWith("en"))
                  {
                      kata[i] = kata[i].Substring(2);
                      //cutting the EN*
                  }
      
                  if (kata[i].EndsWith("ment"))
                  {
                      int panjang = kata[i].Length;
                      int sisa = panjang - 4;
                      kata[i] = kata[i].Substring(0, sisa);
                      //cutting the *Ment
                  }
      
                  if(kata[i].EndsWith("ous"))
                  {
                      int panjang = kata[i].Length;
                      int sisa = panjang - 3;
                      kata[i] = kata[i].Substring(0, sisa);
                      //cutting the ous, tremendous, hazardous
                  }
      
                  if (kata[i].EndsWith("ied"))
                  {
                      int panjang = kata[i].Length;
                      int sisa = panjang -1;
                      kata[i] = kata[i].Substring(0, sisa);
                      //cutting ied
                  }
      
                  if (kata[i].EndsWith("ly"))
                  {
                      int panjang = kata[i].Length;
                      int sisa = panjang - 2;
                      kata[i] = kata[i].Substring(0, sisa);
                      //cutting fluently, diligently
                  }
                  sw.Write(kata[i] + " ");
              }
      
              sw.Flush();
              sw.Close();
              MessageBox.Show("Converted and Saved  ", "KTM Stemming", MessageBoxButtons.OK, MessageBoxIcon.Information);
          }
      

      【讨论】:

        猜你喜欢
        • 2022-10-15
        • 2013-03-03
        • 2018-02-01
        • 2015-07-15
        • 1970-01-01
        • 2017-09-27
        • 2018-10-21
        • 1970-01-01
        • 2013-03-22
        相关资源
        最近更新 更多