2010-09-19 3 views
0

Alors maintenant je veux faire une liste de mots estonien ~ environ 20m mots uniques en minuscules. Pour obtenir une entrée pour la liste de mots, corpus of Estonian peut être utilisé. Les fichiers de corpus sont au format TEI (Text Encoding Initiative). J'ai essayé d'utiliser regex pour trouver les mots.Comment construire une liste de mots

Voici ce que j'ai fait: c'est inefficace, mcv est tout foiré, il freine si le hashset des mots ne tient pas en mémoire, il ne connait pas l'encodage des entrées - donc probablement des lettres comme des problèmes, montre le temps d'exécution estimé, certains contrôles ont des noms par défaut et d'autres pas, il n'utilise pas le multitâche (pas sûr de le faire), il utilise des correctifs bizarres et beaucoup d'interface de verrouillage pour qu'il n'apparaisse pas figé. Au moins c'est si court, que vous remarquez à peine qu'il n'y a pas de commentaires. Upside est, qu'il peut presque lire des mots sans beaucoup d'erreurs, de .tei, .txt, .csv, smgl, xhtml ou d'autres entrées de format similaire.

Maintenant, vous savez ce que je veux faire, comment j'ai essayé de le faire (avec quels problèmes), et encore une fois, je suis juste en train d'essayer de le faire (avec un minimum de travail manuel).

exemple de l'image:

alt text

Exemple de code & Gui:

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.Data.SqlClient; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace Reader 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void listView1_DragEnter(object sender, DragEventArgs e) 
     { 
      if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true) 
      { 
       e.Effect = DragDropEffects.All; 
      } 
     } 

     private void listView1_DragDrop(object sender, DragEventArgs e) 
     { 
      setguiLock(true); 
      this.loading.Visible = true; 
      ignorechecking = true; 
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false); 
      Dictionary<String, ListViewGroup> listviewgroups = new Dictionary<string,ListViewGroup>(); 

      int filenamesi = 0; 

      foreach (string file in files) 
      { 
       progresslabel.Text = string.Format("Progress: \t[ {0}/{1} ]", filenamesi++, files.Length); 
       Application.DoEvents(); 
       if (File.Exists(file)) 
       { 
        FileInfo ff = new System.IO.FileInfo(file); 
        if (!listviewgroups.ContainsKey(ff.DirectoryName)) 
        { 
         listviewgroups.Add(ff.DirectoryName, new ListViewGroup(ff.DirectoryName, HorizontalAlignment.Left)); 
         listView1.Groups.Add(listviewgroups[ff.DirectoryName]); 
        } 
        ListViewItem item = new ListViewItem(ff.Name); 
        listviewgroups[ff.DirectoryName].Items.Add(item); 
        item.Checked = true; 

        item.SubItems.Add("" +((int)ff.Length/1024)+" KB"); 

        // item.Group.Header = ff.DirectoryName; 
        // listviewgroups[ff.DirectoryName].Items.Add(item); 
        listView1.Items.Add(item); 
       } 
      } 
      setguiLock(false); 
      ignorechecking = false; 
      this.loading.Visible = false; 
      updatechecked(); 
     } 

     private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e) 
     { 
      updatechecked(); 
     } 
     private bool ignorechecking = false; 
     private void updatechecked(){ 
      if (ignorechecking) 
       return; 
      long size = 0; 
      int count = 0; 
      foreach (ListViewItem item in this.listView1.Items) 
      { 
       if (item.Checked) 
       { 
        count++; 
        size += Int32.Parse(item.SubItems[1].Text.Split(" ".ToArray())[0]); 
       } 
      } 
      this.text1.Text = ""+count; 
      this.text2.Text = ""+size + " KB"; 
     } 
     private void putHashset(HashSet<string> d, string filename) 
     { 
      StringBuilder sb = new StringBuilder(); 
      foreach (string key in d) 
       sb.Append(key).Append("\n"); 

      File.WriteAllText(filename, sb.ToString()); 
     } 
     private HashSet<string> getHashset(string filename) 
     { 
      return new HashSet<string>(new Regex("\\n+").Split(File.ReadAllText(filename))); 
     } 

     private void removefilefromlistview(string fullfilename) { 
      foreach (ListViewItem item in this.listView1.Items) 
      { 
       String file = item.Group.Header + "\\" + item.SubItems[0].Text; 
       if (fullfilename.CompareTo(file) == 0) 
       { 
        item.Checked = false; 
        this.listView1.Items.Remove(item); 
       } 
      } 
     } 
     private void starter(object sender, EventArgs e) 
     { 
      HashSet<string> filenames = new HashSet<string>(); 
      StringBuilder data = null; 

      setguiLock(true); 
      this.time2.Text = ""; 
      this.time1.Text = String.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now); 

      foreach (ListViewItem item in this.listView1.Items) { 
       if (item.Checked) { 
        String file = item.Group.Header + "\\" + item.SubItems[0].Text; 
        if (File.Exists(file)) 
         filenames.Add(file); 
       } 
      } 

      string outputfile = output.Text; 
      HashSet<string> words = null; 
      if (File.Exists(output.Text)) 
       words = getHashset(outputfile); 
      else 
       words = new HashSet<string>(); 

      int filenamesnr = filenames.Count; 
      int filenamesi = 0; 
      foreach (String str in filenames){ 
       progresslabel.Text = string.Format("Progress: \t[ {0}/{1} ]", filenamesi++, filenamesnr); 
       Application.DoEvents(); 
       data = new StringBuilder(System.IO.File.ReadAllText(str, Encoding.UTF7).ToLower()); 

       data = data.Replace("&auml;", "ä"); 
       data = data.Replace("&ouml;", "ö"); 
       data = data.Replace("&uuml;", "ü"); 
       data = data.Replace("&otilde;", "õ"); 

       String sdata = new Regex(@"<(.|\n)*?>|%[a-zA-Z0-9]+?;|&[#a-zA-Z0-9]+?;").Replace(data.ToString(), ""); 

       foreach (string word in new Regex("[^A-Za-zšžõäöüŠŽÕÄÖÜ]+").Split(sdata)) 
        if(word.Length>1) 
          words.Add(word); 

       removefilefromlistview(str); 
      } 
      progresslabel.Text = "Progress:"; 
      putHashset(words, outputfile); 

      foreach (ListViewItem item in this.listView1.Items) 
       if (item.Checked) 
       { 
        item.Checked = false; 
        listView1.Items.Remove(item); 
       } 

      this.time2.Text = String.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now); 
      setguiLock(false); 
     } 

     private void setguiLock(bool value){ 
      if(value){ 
       this.Enabled = false; 
       this.button1.Enabled = false; 
       this.listView1.Enabled = false; 
       this.output.Enabled = false; 
       this.openoutput.Enabled = false; 
       this.progresslabel.Visible = true; 
       this.Enabled = true; 
      }else{ 
       this.Enabled = false; 
       this.openoutput.Enabled = true; 
       this.output.Enabled = true; 
       this.listView1.Enabled = true; 
       this.button1.Enabled = true; 
       this.progresslabel.Visible = false; 
       this.Enabled = true; 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      if (!File.Exists(output.Text)) 
        File.WriteAllText(output.Text, " "); 
      System.Diagnostics.Process.Start(output.Text); 
     } 
    } 
} 
+1

Qu'est-ce qui ne va pas avec une base de données vanilla? – Juliet

+2

Vous nous demandez de regarder votre code et de le corriger? Je dirais que plusieurs questions plus étroitement définies seraient plus appropriées, telles que "Comment stocker 20m mots dans la mémoire et les rechercher" etc Sur le sujet question cependant, vous pouvez utiliser une base de données comme SQLite3 ou autre pour stocker les fichiers puis utiliser SQL recherches et jointures pour modifier vos données. –

+0

@ Callum Rogers - Votre droit. – Margus

Répondre

1

Vous devez obtenir le bon outil pour le travail. La quantité de données et de balisage dans un corpus linguistique comme celui-ci signifie que vous avez besoin d'une bonne solution d'indexation compatible XML. Les exemples incluent eXist, XAIRA, CQP ...

Questions connexes