Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63

Анализ текста

02.12.2022, 16:50. Показов 986. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте Уважаемые!
В RichTextBox есть текст, раскладываемый на слова после удаления всех символов, кроме букв и цифр. Слова, по количеству вхождений грузятся в ListView.
Проблема: Текст в 28 000 знаков анализируется без проблем. Но, стоит увеличить количество знаков в двое — приложение виснет. Что в отладке, что в скомпилированном виде.
Вопрос: Подскажите в чём беда?

Код удаления не буквенно-цифровых символов.
C#
1
2
3
4
5
        private string HrenDelete(string Hren)
        {
            return Regex.Replace(Hren, "[^а-яёА-ЯЁa-zA-Z0-9]", " ");
 
        }
Отрабатывает на Ура! Вплоть до трёх с половиной миллионов символов использовал — работает.

Код сортировки обработанного текста.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void Analisis(string Text)
        {
 
            string text = Text;
 
            string[] words = text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            var result = words.GroupBy(x => x)
                                .Where(x => x.Count() > 1)
                                .Select(x => new { Word = x.Key, Frequency = x.Count() });
                                
 
            foreach (var item in result)
            {
 
                // Это код добавления в ListView.
                lvStatistics.Items.Add(item.Word).SubItems.Add(item.Frequency.ToString());
            }
 
        }
На сортировке и виснет.
Подскажите — в чём беда?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2022, 16:50
Ответы с готовыми решениями:

Посимвольный анализ текста
Уважаемые знатоки! Можете мне немного помочь? никак не могу понять что я упускаю из виду. Текст из TextBox я заношу в строковую переменную...

Частотный анализ текста
Здравствуйте имеется код на который считает количество каждых букв введенного текста, нужно сделать чтобы он считал парные и тройные...

Частотный анализ текста
Имеется рабочий код для частотного анализа текста по 1 букве, т.е. он пересчитывает каждую букву в тексте и выводит в ричтекстбокс...

14
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
03.12.2022, 00:28
Попробуйте такой вариант, интерфейс сами нарисуете
Вложения
Тип файла: zip WinFormsApp1.zip (266.0 Кб, 7 просмотров)
1
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
03.12.2022, 16:21  [ТС]
Большое спасибо за ответ. Но форум глючит и не даёт скачать вложения.))
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
03.12.2022, 16:23
Diamock, тогда так
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
using System.Text.RegularExpressions;
 
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
 
        private readonly string _regExpOnlyWords = @"\b\w+\b";
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        private MatchCollection HrenDelete(string Hren)
        {
 
            if (string.IsNullOrEmpty(Hren)) { throw new ArgumentException("Исходная строка пустая!"); }
 
            return Regex.Matches(Hren, _regExpOnlyWords);
 
        }
 
        private Dictionary<string, int> Analisis(string Text)
        {
 
            if (string.IsNullOrEmpty(Text)) { throw new ArgumentException("Исходная строка пустая!"); }
 
            var words = HrenDelete(Text);
 
            var analisisResult = new Dictionary<string, int>(words.Count);
 
            foreach (Match item in words)
            {
                if (!analisisResult.ContainsKey(item.Value))
                {
                    analisisResult.Add(item.Value, 1);
                }
                else
                {
                    analisisResult[item.Value]++;
                }
            }
            return analisisResult;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            foreach (var item in Analisis(richTextBox1.Text))
            {
                if (item.Value > 1)
                {
                    listView1.Items.Add(item.Key).SubItems.Add(item.Value.ToString());
                }
            }
        }
    }
}
1
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
03.12.2022, 17:15  [ТС]
Спасибо за оперативный ответ. Потестю и отпишусь)))

Добавлено через 48 минут
116rus, дружище!
Прям ОГРОМНОЕ СПАСИБО!
Проверил на тексте в 4 миллиона знаков — обрабатывает за пару секунд.

Если вы не против, я бы ещё пару вопросов вам задал в продолжение этой темы.
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
03.12.2022, 17:22
Diamock, задавайте
0
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
03.12.2022, 18:36  [ТС]
Хотелось бы отсортировать на лету — вхождения по количеству:
  • max->min
  • min->max
С возможность выбора в методе, как enum.
C#
1
2
3
4
5
        enum Sorted
        {
            Descending,     // По убыванию количества вхождений.
            Ascending       // По увеличению количества вхождений.
        }
Первым столбцом в ListView отображать порядковый номер от общего количества уникальных вхождений, а в четвёртом процентное соотношение употребления от общего количества слов исходного текста.

P.S. Конечно, в процессе написания пары вопросов возникла ещё куча параллельных... Но, сначала разберусь с классами MatchCollection и Dictionary, а после буду спрашивать.
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
03.12.2022, 19:12
Diamock, https://dropfiles.ru/download/... 1eae5.html
Процентное соотношение я указал как считать, выведете сами)
1
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
05.12.2022, 15:27  [ТС]
В продолжение темы...
Со всем разобрался. С нумерацией, с процентами. Спасибо!

Только тестирование выявило косяки в условиях поставленной мной себе задаче.

Проблема 1.
Убирая из текста все не буквенно-цифровые символы из анализа выпадают слова с дефисами.
Как пример:
  • Кто-то
  • Фиолетово-чёрный
  • А-а-а

Если в регулярку добавить дефис, то слово по нему и обрезается.
Как пример:
  • Кто-
  • Фиолетово-
  • А-

А отсечённая часть считается за отдельное слово.
Как пример:
  • то
  • чёрный
  • а-
  • а

Проблема 2.
К тому же, я упустил регистрозависимость!
Как пример:
  • Белый
  • белый
Одно слово написанное с маленькой и большой буквы — отсортировывается, как два разных слова.
Конечно можно перевести анализируемый текст к единому регистру, но КАПС — смотрится дико, а имена собственные в нижнем регистре не комильфо.
Остаётся метод String.Equals и сортировать без учёта регистра. Но что будет записываться в item.Key? Первое вхождение слова или последнее?
Что я хочу? Чтобы обычные слова отображались в нижнем регистре, а имена собственные, как и положено.
В такой ситуации мне видится, что надо на этапе сортировки сравнивать вхождения слова и если все вхождения в разном регистре — преобразовывать в нижний. А, если все вхождения в одном регистре — оставлять как есть?

Так вот!
По первой проблеме — идей нет вообще.
По второй — только идеи. За реализацию не принимался. Пока не знаю с какой стороны подбираться.
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
05.12.2022, 17:54
Diamock, без долго гугления, замените регулярное выражение на
C#
1
 private readonly string _regExpOnlyWords = @"\b(\w+(?:-\w+)?)\b";
Добавлено через 19 минут
Diamock,
C#
1
 var analisisResult = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase);
1
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
05.12.2022, 19:06  [ТС]
116rus, спасибо — буду пробовать.

Добавлено через 56 минут
В том, что код будет работать, даже не сомневался. Но есть некоторые вопросы по синтаксису регулярки.
Рассмотрим фрагмент:
C#
1
@"\b(\w+(?:-\w+)?)\b"
\b — в начале и в конце, определяют границы слова.
Если исходить из MSDN,
w+, соответствует одному или нескольким символам слова, а в скобках указываем (?:-\w+)?), что дефис (-) является частью слова и всё, что после него до пробела часть этого слова.
Я правильно понял? Если нет — поясните или дайте ссылку где почитать.

И ещё один момент.
В этом фрагменте кода StringComparer.InvariantCultureIgnoreCase] — игнорируется регистр слова и написание слова происходит с учётом регистра первого вхождения.

Есть ли возможность в процессе сортировки определить регистр вхождения слова? И если вхождение в двух регистрах — в item.Key писать в нижнем регистре.
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
05.12.2022, 19:08
Diamock, ну, подумайте сами, я вам и так все практически сделал)
1
 Аватар для Diamock
20 / 20 / 5
Регистрация: 22.07.2015
Сообщений: 63
05.12.2022, 19:11  [ТС]
116rus, спасибо!) Мысли есть. Если буду тупить — напишу.
А, про регулярку — я правильно понял?
0
0 / 0 / 0
Регистрация: 27.01.2023
Сообщений: 12
16.02.2023, 20:46
Доброго времени суток всем. Продолжаю изучать C# по Герберту))
Ребята расскажите пожалуйста значение фраз "первого вхождения", "последнего вхождения". Даже загуглить правильно не могу. Что это вообще значит?
Индекс, это номер символа, начиная отсчет с начала строки от 0 и далее.
Первое вхождение, это индекс впервые найденного в строке искомого слова?
Последнее вхождение, это индекс впервые найденного символа ведя поиск с конца строки?
0
643 / 338 / 139
Регистрация: 19.10.2013
Сообщений: 1,209
16.02.2023, 20:49
Oleg1302, строка представляет собой массив символов. Почитайте про массивы еще.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2023, 20:49
Помогаю со студенческими работами здесь

Пословный частотный анализ текста
Здравствуйте. Есть рабочий код, который считает частоту появления каждого слова в тексте. Проблема в том, что если слово встречается...

Анализ текста.
Доброго времени суток. Друзья, помогите советом. Надо написать программу, которая будет определять в тексте самый часто используемый...

Частотный анализ текста
Необходимо написать консольное приложение на C#, выполняющее частотный анализ текста. Входные параметры: путь к текстовому файлу. ...

Частотный анализ текста
С# Помогите написать программу, которая будет принимать на вход список слов и в результате выдавать отсортированный список по убыванию в...

Статистический анализ текста
есть текст в richTextBox1, ввожу букву в textbox2, получаю кол-во этих букв в тексте на textbox1 и еще я все никак не могу написать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru