С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 07.03.2020
Сообщений: 7
1

Частотный анализ текста

07.03.2020, 03:49. Показов 10839. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо написать консольное приложение на C#, выполняющее частотный анализ текста.
Входные параметры: путь к текстовому файлу.
Выходные результаты: вывести на экран через запятую 10 самых часто встречающихся в тексте триплетов (3 идущих подряд буквы слова), и на следующей строке время работы программы в миллисекундах.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2020, 03:49
Ответы с готовыми решениями:

Криптоаналистическая статическая атака (частотный анализ текста)
Пиши программу взлома шифра Цезаря,вот код алгоритма определяющего какие символы в тексте,частоту...

Частотный анализ
Дан текст. Выведите все слова, встречающиеся в тексте, по одному на каждую строку. Слова должны...

Частотный анализ шифра Цезаря
У меня есть программа шифрования методом Цезаря. Нужно доделать, добавив частотный анализ...

Частотный анализ и Брутфорс шифра Цезаря
Привет всем) я закодил на Сишарпе шифр Цезаря) смысл в том что я могу кодировать файл и...

13
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
07.03.2020, 10:27 2
Chester00714, надо начать хотя бы. Или совсем 0 в программировании ?
0
0 / 0 / 0
Регистрация: 07.03.2020
Сообщений: 7
07.03.2020, 11:02  [ТС] 3
Я именно не могу понять как строку разделить по 3 элемента. Я файл открыл и записал все в строку. Пробовал через Linq и никак не получается
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
07.03.2020, 11:11 4
Цитата Сообщение от Chester00714 Посмотреть сообщение
строку разделить по 3 элемента
Так как в условии написано, что
Цитата Сообщение от Chester00714 Посмотреть сообщение
3 идущих подряд буквы слова
то делить нужно не строку, а каждое слово. То есть, тест нужно разбить на слова по пробелам и знакам препинания, потом перебирать слова и уже в них выделять тройки букв и записывать в словарь или коллекцию, одновременно подсчитывая количество повторов.
0
0 / 0 / 0
Регистрация: 07.03.2020
Сообщений: 7
07.03.2020, 11:20  [ТС] 5
Ты можешь как нибудь код набросать, чтоб я потом по нему и сделал
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
07.03.2020, 11:43 6
Лучший ответ Сообщение было отмечено Chester00714 как решение

Решение

Цитата Сообщение от Chester00714 Посмотреть сообщение
код набросать
например как разбить строку на тройки букв
Частотный анализ текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            string s = "одновременно подсчитывая количество";
            string[] s1 = s.Split();
            string ss;
            for (int j = 0; j < s1.Length; j++)
            {
                s = s1[j];
                for (int i = 0; i < s.Length - 2; i++)
                {
                    ss = s.Substring(i, 3);
                    Console.WriteLine(ss);
                }
            }
            Console.ReadKey();
1
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
07.03.2020, 11:50 7
Цитата Сообщение от Chester00714 Посмотреть сообщение
время работы программы в миллисекундах.
Цитата Сообщение от Chester00714 Посмотреть сообщение
через Linq
Так как Вам важно время, если я правильно понял, то лучше делать без Linq, ИМХО.
0
es geht mir gut
11272 / 4756 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
07.03.2020, 12:21 8
Лучший ответ Сообщение было отмечено Chester00714 как решение

Решение

Вот так можно искать повторяющиеся триплеты с использованием словаря.

Хочу заметить, что существуют и другие варианты решения, возможно более оптимальные, я предлагаю один из возможных.
Короче, направление определено, дальше сами прилагайте какие-то усилия.

Частотный анализ текста
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
07.03.2020, 14:03 9
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using System.Diagnostics;
using System.Threading;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp40
{
    class Program
    {
       
 
        static void Main(string[] args)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            
 
            Console.WriteLine("Введите путь к текстовому файлу:");
            string adress1 = Console.ReadLine(); 
            string text = System.IO.File.ReadAllText(adress1, System.Text.Encoding.GetEncoding(1251));  
            System.Console.WriteLine("Содержание файла:  \n{0}", text);
            char[] a = text.ToCharArray();
            List<string> triplet = new List<string>();
            int cnt = 0;
            bool flag;
            string str = "";
            for (int i = 0; i < a.Length - 3; i++)
            {
                if (char.IsLetter(a[i]) & char.IsLetter(a[i + 1]) & char.IsLetter(a[i + 2]))
                {
                    cnt = 0;
                    flag = true;
                    for (int j = 0; j < a.Length - 3; j++)
                    {
                        if (a[i] == a[j] & a[i + 1] == a[j + 1] & a[i + 2] == a[j + 2])
                        {
                    
                            if (flag)
                            {
                                str = Char.ToString(a[i]) + Char.ToString(a[i + 1]) + Char.ToString(a[i + 2]);
                                flag = false;
                            } 
                            cnt++;
                                                     
                        }
                       
                    }
                    str =  str + " " + cnt.ToString();
                    triplet.Add(str); 
                    
                }
                
            }
 
            string temp;
 
            for (int i = 0; i < triplet.Count; i++)
            {
                for (int j = 0; j < triplet.Count-1; j++)
                {
 
                    if (Convert.ToInt32(triplet[j].Substring(4)) < Convert.ToInt32(triplet[j+1].Substring(4)))
                    {
                        temp = triplet[j];
                        triplet[j] = triplet[j+1];
                        triplet[j+1] = temp;
                    }
                }
            }
            Console.WriteLine();
            Console.WriteLine("Всего найдено {0} не повторяющихся триплетов.", triplet.Count);
            for (int i = 0; i < 10; i++)
            {     
                Console.Write(triplet[i].Substring(0,3) + ", ");
            }
            Console.WriteLine();
 
 
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00} часов, {1:00} минут, {2:00} секунд, {3:000} миллисекунд",
                        ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
            Console.WriteLine("Время выполнения программы: " + elapsedTime);
 
            Console.WriteLine();
            Console.WriteLine("Нажмите любую клавишу для выхода из программы");
            Console.ReadKey();
        }
    }
}
В программе используется класс List<string> triplet = new List<string>();
Если кто из знатоков подскажет как сделать класс IComparer именно для данного случая задания буду признателен.
0
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,252
Записей в блоге: 2
07.03.2020, 15:19 10
Цитата Сообщение от Chester00714 Посмотреть сообщение
Я именно не могу понять как строку разделить по 3 элемента.
Метод возвращает последовательность всех символов склеенных по указанной в параметре length длине.
C#
1
2
3
4
5
        public static IEnumerable<string> SwimParts (string source, int length)
        {
            for (int i = length; i <= source.Length; i++)
                yield return source.Substring(i - length, length);
        }
Добавлено через 12 минут
Использование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        static void Main(string[] args)
        {
 
            string text = 
@"Необходимо написать консольное приложение на C#, выполняющее частотный анализ текста.
Входные параметры: путь к текстовому файлу.
Выходные результаты: вывести на экран через запятую 10 самых часто встречающихся в тексте триплетов(3 идущих подряд буквы слова), и на следующей строке время работы программы в миллисекундах.";
 
            var groups = SwimParts(text, 3)
                .GroupBy(str => str);
 
 
            Console.WriteLine(string.Join
                (
                    Environment.NewLine,
                    groups.OrderByDescending(gr => gr.Count()).Take(10).Select(gr => $"\"{gr.Key}\" встретилось {gr.Count()} раз")
                )) ;
Консоль" на" встретилось 4 раз
"ход" встретилось 3 раз
"на " встретилось 3 раз
"сто" встретилось 3 раз
" те" встретилось 3 раз
"тек" встретилось 3 раз
"екс" встретилось 3 раз
"кст" встретилось 3 раз
"ть " встретилось 2 раз
"ь к" встретилось 2 раз
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
08.03.2020, 16:34 11
Элд Хасп, у вас текст нарезан на три идущих подряд символа, а в задании указано, что требуется найти триплеты только из букв.
0
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,252
Записей в блоге: 2
08.03.2020, 16:45 12
Лучший ответ Сообщение было отмечено Chester00714 как решение

Решение

Цитата Сообщение от ValentinNemo Посмотреть сообщение
у вас текст нарезан на три идущих подряд символа, а в задании указано, что требуется найти триплеты только из букв.
Это же к самому методу не относится.
При его использовании добавьте какую нужно сортировку или фильтрацию.
Например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            string text =
@"Необходимо написать консольное приложение на C#, выполняющее частотный анализ текста.
Входные параметры: путь к текстовому файлу.
Выходные результаты: вывести на экран через запятую 10 самых часто встречающихся в тексте триплетов(3 идущих подряд буквы слова), и на следующей строке время работы программы в миллисекундах.";
 
            var groups = SwimParts(text, 3)
                .Where(str => str.All(ch => char.IsLetter(ch)))
                .GroupBy(str => str);
 
 
            Console.WriteLine(string.Join
                (
                    Environment.NewLine,
                    groups.OrderByDescending(gr => gr.Count()).Take(10).Select(gr => $"\"{gr.Key}\" встретилось {gr.Count()} раз")
                ));
Консоль
Код
"ход" встретилось 3 раз
"сто" встретилось 3 раз
"тек" встретилось 3 раз
"екс" встретилось 3 раз
"кст" встретилось 3 раз
"юще" встретилось 2 раз
"час" встретилось 2 раз
"аст" встретилось 2 раз
"одн" встретилось 2 раз
"дны" встретилось 2 раз
1
1843 / 1185 / 501
Регистрация: 14.10.2018
Сообщений: 3,180
08.03.2020, 17:23 13
Цитата Сообщение от Chester00714 Посмотреть сообщение
3 идущих подряд буквы слова
можете привести примеры данных слов на любом национальном языке ?
0
0 / 0 / 0
Регистрация: 07.03.2020
Сообщений: 7
08.03.2020, 17:29  [ТС] 14
Это я уже все сделал, теперь мне надо сделать так чтобы при нажатии клавиши происходила отмена обработки и выводились результаты
0
08.03.2020, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2020, 17:29
Помогаю со студенческими работами здесь

Вывести частотный словарь введенного текста
Помогите,Плиз. срочно нужно Пользователь вводит n предложений на латинице. Вывести...

Строка: Составить частотный список символов текста.
Составить частотный список символов текста.

Частотный анализ звука в avi видео
Уважаемые формучане, надеюсь на вашу помощь. Нужно произвести частотный анализ звукового потока...

Частотный анализ текста
Помогите решить задачу! Дана строка, содержащая текст, набранный заглавными русскими буквами....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru