2012-05-23 93 views
-1

请原谅我,我试图做出简单的应用程序,将单词转换为单词。例如如何将段落转换为根词

启用=能够 支付=支付

在我的记事本的文字是“让金”

我使用2个例词上面,我没有得到我需要什么。我在notepad.txt上写了“enable”和“payment”。那么应用程序将开始并获取该词。

和应用程序将启动微调切“恩”字和“彪”所以他们的结果将是“能”和“支付”

我的应用程序可以修剪一个字“启用” “有能力”。和“支付”来“买单”,但是,如果我写了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); 
    } 
} 

}

+1

梗阻不是一个简单的过程。我建议在Lucene.Net中使用一些类似雪球分析器的库http://www.apache.org/dist/incubator/lucene.net/source/2.9.4g-incubating/ –

+0

尤其是使用英语(以及可能的任何语言)当你说到“进入”或“哀叹”时会发生什么? –

回答

1
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<kata.Length; i++)也写在你的for循环之外的文件中,所以你要么把你的写作放在循环中,要么做另一个for循环。

1

您递增索引变量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); 
     } 
    } 
2

你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")时,它会返回'能够支付',这是您想要的输出。

+0

它不工作,我没有任何想法,它出现错误,第一次我做了应用程序,我使用上面显示的迭代,它没有工作,然后我尝试foreach,然后另一个令人困惑的逻辑显示:( – nencor

0

谢谢你的帮助!:)我真的很感激它,虽然我不明白一些答案: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); 
    }