2013-10-26 71 views
1

所以我正在研究一个文本挖掘项目,并且正在尝试实现信息增益。我有一个数据,其中每行描述一个文档。所以一个新的行字符分裂不同的文件。为什么这个循环运行如此缓慢:c#

我必须生成一个矩阵,其中列是所有文档中的所有不同的单词,行是不同的文档。如果该单词存在或不存在于该文档中,则该表中的每个单元格为1(真)或0(假)。 共有987个文件,总词数为22860,总共有3680个单词。因此3680个单词与22860个单词相比较。这个单词运行缓慢,但它很好。花费更多时间的循环是当我遍历单词列表的对象以生成矩阵时。见下面

注意:我已经删除了文件中的所有重复单词。

class word_list 
     { 
      public string word; 
      public List<bool> doc= new List<bool>(); 
     };//class ends 

     private void button2_Click(object sender, EventArgs e) 
     { 
      //Convert the string into an array of words 
      string[] w1 = richTextBox1.Text.Trim().Split('\n',' ').Select(x => x.Trim().ToLower()).Distinct().ToArray(); //all distinct words 
      string[] rich_doc = richTextBox1.Text.Trim().Split('\n'); //all documents array 
      List<word_list> words = new List<word_list>(); 

      richTextBox2.Text+=("no. of distict words: " + w1.Length + ", no. of docs " + rich_doc.Length); 
      for (int i = 0; i < w1.Length; i++) 
      { 
       word_list temp = new word_list(); 
       temp.word = w1[i]; //temp has the current distict word as class object 

       for(int j=0;j<rich_doc.Length;j++)//traverse all doc array 
       { 
        temp.doc.Add(false); 
        List<string> doc_word = Regex.Split(rich_doc[j], @"\b").Distinct(StringComparer.CurrentCultureIgnoreCase).ToList(); 
        //richTextBox2.Text += ("\n no. of words in this doc: " + doc_word.Count); 
        //richTextBox2.SelectionStart = richTextBox1.Text.Length; 
        //richTextBox2.Focus(); 
        int doc_count = doc_word.Count; // number of docs 
        for (int k = 0; k < doc_count; k++)//All words in a doc are compared 
        { 
         if(doc_word[k].ToLower() == w1[i].ToLower()) 
         { 
          temp.doc[temp.doc.Count-1]=true;        
          break; 
         } 
        }      
       } 
       if ((words.Count - 1)>=0) 
        richTextBox2.Text += ("\n word(" + words.Count + "/" + w1.Length + "): " + words[words.Count - 1].word); 
       richTextBox2.SelectionStart = richTextBox1.Text.Length; 
       richTextBox2.Focus(); 
       words.Add(temp); 
      } 
      //generate matrix 
      int t = rich_doc.Length; //no. of docs 
      int word_count = words.Count; 
      richTextBox1.Text = "Doc"; 
      foreach (word_list w in words) 
      { 
       richTextBox1.Text += "\t" + w.word; 
      } 
      richTextBox1.Text += "\n"; 
//This loop is slow 
      for (int i = 0; i < t; i++) //traverse through number of docs 
      { 
       richTextBox1.Text += i + 1; 
       for (int h = 0; h < word_count; h++)//traverse through each distinct word in the list 
       { 
        if (words[h].doc[i]) 
         richTextBox1.Text += "\t1"; 
        else 
         richTextBox1.Text += "\t0"; 
       } 
       richTextBox1.Text += "\n"; 
      } 
     }//end of button 2 
+0

mediafire.com/?4mojnj4j153q76s:这是正在处理的数据,richtextbox2用于测试目的 – Rishabh876

+2

考虑使用“StringBuilder”构建字符串而不是使用“TextBox.Text”作为工作空间。 –

回答

2

ta.speot.is是正确的。字符串应该使用StringBuilder构建,例如使用Append,并且仅在循环之后,您将字符串分配给richTextBox1.Text。代码将如下所示:

 //generate matrix 
     StringBuilder sb = new StringBuilder(); 
     int t = rich_doc.Length; //no. of docs 
     int word_count = words.Count; 
     richTextBox1.Text = "Doc"; 
     foreach (word_list w in words) 
     { 
      sb.Append("\t"); 
      sb.Append(w.word); 
     } 
     sb.AppendLine(); 

     //This loop is not slow anymore :) 
     for (int i = 0; i < t; i++) //traverse through number of docs 
     { 
      sb.Append(i + 1); 
      for (int h = 0; h < word_count; h++)//traverse through each distinct word in the list 
      { 
       if (words[h].doc[i]) 
        sb.Append("\t1"); 
       else 
        sb.Append("\t0"); 
      } 
      sb.AppendLine(); 
     } 
     richTextBox1.Text = sb.ToString(); 

编辑:下面有宝贵的意见。改变RichEditBox.Text属性是这里最昂贵的操作。

+0

现在就试试 – Rishabh876

+0

与不使用'richTextBox1.Text'相比'StringBuilder'可能是一个简单的优化。设置“文本”将启动各种处理。 –

+0

他使用'string + ='这个事实可能不如他使用'richTextBox.Text + =';的事实那么痛苦)当然string-addition比StringBuilder.Append慢很多,但是设置文本和中继/重新绘制屏幕上的文字更慢! (虽然RTBox可能不会立即重新绘制,但仍会强制无效和许多不必要的重绘。) – quetzalcoatl