2012-05-23 127 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); 
    }