Частота появления биграмм в тексте - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток Искала по форуму похожую проблему -не нашла. Задание такое, нужно посчитать частоту вхождения каждой монограммы и биграммы в текст (в тексте только строчные русские буквы и пробелы). Монограммы я искала так:
namespace lab1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] alphabet = File.ReadAllLines("russian_alphabet.txt", Encoding.GetEncoding(1251));
            string text1 = File.ReadAllText("russian_text1.txt", Encoding.GetEncoding(1251));
            Dictionary<string, int> frequency1 = new Dictionary<string, int>();
           for (int i = 0; i < alphabet.Length; i++)
            {
             alphabet[i] = alphabet[i].Trim();
             frequency1[alphabet[i].ToString()] = 0;
            }
            for (int i = 0; i < text1.Length; i++)
            {
                if (frequency1.ContainsKey(text1[i].ToString()))
                {
                 frequency1[text1[i].ToString()]++;
                }
            }

            StringBuilder answer1 = new StringBuilder();
            for (int i = 0; i < alphabet.Length; i++)
            {
                if (frequency1.ContainsKey(alphabet[i].ToString()))
                {
                    double p1;
                    p1 = (double)frequency1[alphabet[i]] / text1.Length;
                    
                    answer1.AppendLine(alphabet[i] + ' ' + p1.ToString());
                    
                }
                else
                {
                 answer1.AppendLine(alphabet[i] + " 0");
                }
            }
            File.WriteAllText("answer_file1.txt", answer1.ToString(), Encoding.GetEncoding(1251));
            File.WriteAllLines("answer_file1.txt", File.ReadAllLines("answer_file1.txt", Encoding.GetEncoding(1251)).OrderByDescending(a=>a.Substring(2)), Encoding.GetEncoding(1251));
 
       }
    }
}
Интуиция подсказывает, что записывать в файл все комбинации букв, как с алфавитом, - немного не то. Может, есть смысл обозначать каждую букву в качестве string "первая буква", вторую как string "вторая буква", и биграмма будет string s = "первая буква"+"вторая буква", а потом искать в тексте вхождения? Больше ничего в голову не приходит

Решение задачи: «Частота появления биграмм в тексте»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Filetest {
     class Qwin : Queue<char>
     {
          public override string ToString()
          {
               return  this.Aggregate("", (current , gg) =>current + gg);
          }
 
          public override int GetHashCode()
          {
              return ToString().GetHashCode();
          }
 
          public override bool Equals(object obj)
          {
               var s = obj as Queue<char>;
               var ss = ToArray();
               var zz = s?.ToArray();
               return !ss.Where((t, i) => zz != null && t != zz[i]).Any();
          }
     }
     class Program
     {
     static void Main(string[] args)
          {
             
                try {
               var txt = File.ReadAllText("source.txt");
               Console.WriteLine("Вставьте желаемое колисество символов");
               Line();
               var num = Convert.ToInt32(Console.ReadLine());
               Console.WriteLine(@"Вставьте  желаемое колисество совпадений (0 для всех)");
               var count = Convert.ToInt32(Console.ReadLine());
               Line();
                TrigrammSearch(txt , num , count);
          }
               catch (Exception e) {
                    Console.WriteLine(e.Message);
               }
 
               Console.ReadLine();
          }
 
          private static void Line()
          {
               Console.WriteLine(new string('-', 15));
          }
 
          private static void TrigrammSearch(string text,int colsimvol,int colsovpadenia)
          {
            
             var trigramDictionary=new Dictionary<string, int>();
             var  trigramqueue =new Qwin();
               var trigramqueueTemp = new Qwin();
               var count = 0;
               var temp = "";
            foreach (var e in text)
               {
                    trigramqueue.Enqueue(e);
                    if (trigramqueue.Count!=colsimvol)continue;
                    foreach (var a in text)
                         {
                              trigramqueueTemp.Enqueue(a);
                              if (trigramqueueTemp.Count != colsimvol) continue;
                              var ads = trigramqueue.Equals(trigramqueueTemp);
                              if (ads) count++;
                              trigramqueueTemp.Dequeue();
                         }
                 temp = trigramqueue.Aggregate(temp, (current, gg) => current + gg);
                    if(!trigramDictionary.ContainsKey(temp))
                         trigramDictionary.Add(temp , count);
                    trigramqueue.Dequeue();
                    temp = null;
                    count = 0;
                    
               }
               foreach (var e in trigramDictionary)
               {
                    if (e.Value==colsovpadenia && colsovpadenia!=0)
                    {
                         File.AppendAllText($"List{colsimvol}Gram{colsovpadenia}.txt", e.Key + " " + e.Value+"\n");
                         Console.WriteLine(e.Key + " " + e.Value);
                    }
                    else if (colsovpadenia==0)
                    {
                      File.AppendAllText($"List{colsimvol}GramAll.txt" , e.Key + " " + e.Value+"\n");
                         Console.WriteLine(e.Key + " " + e.Value);
                    }
                   
                
               }
             
          }
     }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы