Частота появления биграмм в тексте - 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);
}
}
}
}
}