Частота появления биграмм в тексте - C#
Формулировка задачи:
Доброго времени суток
Искала по форуму похожую проблему -не нашла.
Задание такое, нужно посчитать частоту вхождения каждой монограммы и биграммы в текст (в тексте только строчные русские буквы и пробелы).
Монограммы я искала так:
Интуиция подсказывает, что записывать в файл все комбинации букв, как с алфавитом, - немного не то.
Может, есть смысл обозначать каждую букву в качестве string "первая буква", вторую как string "вторая буква", и биграмма будет string s = "первая буква"+"вторая буква", а потом искать в тексте вхождения?
Больше ничего в голову не приходит
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)); } } }
Решение задачи: «Частота появления биграмм в тексте»
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); } } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д