Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Разбор текста на части

09.11.2020, 15:16. Показов 1436. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет,
добрался тут до текста и его разбора, основной список задач такой:
- подсчёт слов/символов с разными разделителями (включая пробелы, переносы строк, табуляции)
- выборка текста с фильтрацией, например выбрать все символы, которые не являются буквами английского алфавита, и т.п.
- составление словаря с подсчётом из первого пункта

собственно я могу всё сделать на уровне команд а-ля 1999 года, но например тот же LINQ вдруг предложит что-то более интересное. Во вложении пример файла для работы. Достаточно консольного приложения с выводом результатов в отдельные файлы.

PS: немного комментариев по пунктам. Под разделителями я понимаю не просто один символ, а скорее список символов - сразу например пробел, табуляция, перевод строки, запятая, точка, восклицательный знак, вопрос и т.д. Можно пойти от противного и считать разделителем всё что не английская буква.
Иметь возможность оперировать с регистрозависимым текстом, July != july, числительные воспринимать как слова.
Вложения
Тип файла: zip 20000 Leagues Under the Sea.zip (299.1 Кб, 3 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2020, 15:16
Ответы с готовыми решениями:

Разбор строки на составные части
Здравствуйте, друзья! Есть документ со множеством строк такого вида: "ASUS N551JM-CN099H 15.6"(1920x1080)/Intel Core i5...

Разбор методов реализованных в проекте и разьяснение части кода
Программа предназначенна для чтения файлов логов, больших обьемов, я не сосвсем понимаю как она работает и не могу разобраться с лябда...

Калькулятор. Разбор текста из TextBox
сбор и отображение чисел и + - * / в textBox1 и вывод в него результата соответствующей операции. using System; using...

15
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.11.2020, 18:23
belalugoci, смотрите в сторону регулярных выражений. Думаю с ними задача станет намного проще.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
09.11.2020, 19:10  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
смотрите в сторону регулярных выражений. Думаю с ними задача станет намного проще.
думается мне проще будет выучить корейский и начать сниматься в дорамах.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.11.2020, 23:00
belalugoci, зря вы так. Вот пример подсчета повторений слов в вашем тексте.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main()
    {
        string input = File.ReadAllText("20000 Leagues Under the Sea.txt");
        StringBuilder output = new StringBuilder();
 
        foreach (var x in Regex.Split(input, @"[^a-zA-Z0-9]+").Where(x => x != "").OrderBy(x => x).GroupBy(g => g))
            output.Append($"{x.Key,20}: {x.Count()}\n");
 
        File.WriteAllText("output.txt", output.ToString());
        Console.WriteLine("Done!");
        Console.ReadKey();
    }
}
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
10.11.2020, 00:57  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
зря вы так. Вот пример подсчета повторений слов в вашем тексте.
просто знаю что говорю. вот например
C#
1
2
string pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$";
всего лишь пример шаблона для проверки на Email.
Еще за сегодня появилась необходимость разбирать слова как однокоренные, например
blow
blowup
blowing
blowed
unblow
reblow
blowin
и т.п. Но не обязательно строго английским правилам, это скорее просто поиск вхождений слов.
За пример спасибо, уже почитал немного про простые регэкспы, чтобы хоть понимать.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
10.11.2020, 01:13
Цитата Сообщение от belalugoci Посмотреть сообщение
всего лишь пример шаблона для проверки на Email.
С опытом оно уже не такое страшное для понимания, как кажется. Да и регулярки не обязательно такие навороченные делать.

Цитата Сообщение от belalugoci Посмотреть сообщение
Еще за сегодня появилась необходимость разбирать слова как однокоренные
Тут вообще сложностей не вижу. Обычный поиск подстроки.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
10.11.2020, 02:10  [ТС]
C#
1
2
3
           foreach (var x in Regex.Split(input, @"[a-zA-Z0-9]+").Where(x => x != "").OrderBy(x => x).GroupBy(g => g))
                output2.Append($"{x.Key,20}: {x.Count()}\n");
            File.WriteAllText(@"c:\work\words\output2.txt", output2.ToString());
сделал по аналогии, наоборот убрал текстовые данные, но на выходе в том числе объединяет символы, то есть ". . ." как отдельные пробелы и точки не считает, то есть Split разделителем считает момент отсутствия (исключения) нужных символов из маски, а как разбивать на отдельные символы именно для второй группы output2? чтобы пробелы, апострофы, ковычки, точки и т.п. рассматривались исключительно только как отдельные символы?
Пример вывода как сейчас:
': 2989
: 120097
.: 2
. . . : 12
. . . ! : 3

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

Цитата Сообщение от QuakerRUS Посмотреть сообщение
С опытом оно уже не такое страшное для понимания, как кажется
наверное вы правы, но освоить как-то до сих пор не смог, особенно LINQ, что за чем следует и почему именно так пока мне не покоряется.

Добавлено через 14 минут
еще ломаю голову как исключить все x.Count()<2

Добавлено через 9 минут
Цитата Сообщение от belalugoci Посмотреть сообщение
еще ломаю голову как исключить все x.Count()<2
забрутфорсил Where(x => x.Count() > 1) в конце всей строки и получилось.

Добавлено через 10 минут
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Тут вообще сложностей не вижу. Обычный поиск подстроки.
это понятно, проблема в реализации, нужно как-то указывать длину корня, например минимум в 2 символа и искать корень в словах которые не превысят длины например в 2 раза, то есть
up
и
uprise
уже исключаются, а
anal
и
analize
остаются.
Потом нужно как-то запрос сделать чтобы прогон был для каждого слова, то есть where еще один после всех остальных действий. Пока не улавливаю как именно.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
10.11.2020, 03:25
Цитата Сообщение от belalugoci Посмотреть сообщение
два последних не должны склеиваться в кучу, а быть в подсчете отдельно как пробелы, точки и восклицательный знак.
Можно от обратного пойти:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
class Program
{
    static void Main()
    {
        string input = File.ReadAllText("20000 Leagues Under the Sea.txt");
        StringBuilder output = new StringBuilder();
 
        foreach (var x in Regex.Matches(input, @"[^\w\r\n]{1}").Cast<Match>().Select(x => x.Value).OrderBy(x => x).GroupBy(g => g))
            output.Append($"{x.Key}: {x.Count()}\n");
 
        File.WriteAllText("output.txt", output.ToString());
        Console.WriteLine("Done!");
        Console.ReadKey();
    }
}
Цитата Сообщение от belalugoci Посмотреть сообщение
минимум в 2 символа и искать корень в словах которые не превысят длины например в 2 раза
В чем проблема? Сравните удвоенную длину корня с длиной строки. Все можно настроить условиями (тем же Where).
0
Эксперт .NET
 Аватар для Rius
13153 / 7711 / 1679
Регистрация: 25.05.2015
Сообщений: 23,500
Записей в блоге: 14
10.11.2020, 05:57
Цитата Сообщение от belalugoci Посмотреть сообщение
просто знаю что говорю. вот например
C#
1
2
string pattern = @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$";
всего лишь пример шаблона для проверки на Email.
Никогда не проверяйте e-mail адреса по стандартам RFC
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
10.11.2020, 07:25  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
проверки на Email
ответ абсолютно не по теме.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.11.2020, 07:22  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
В чем проблема?
проблема в непонимании самой механики работы.

C#
1
2
3
            foreach (var x in Regex.Matches(input, @".{1}").Cast<Match>().Select(x => x.Value).OrderBy(x => x).GroupBy(g => g))
                output_1.Append($"{x.Key},{x.Count()}\n");
            File.WriteAllText(@"c:\work\words\output_1.txt", output_1.ToString());
C#
1
2
3
            foreach (var x in Regex.Matches(input, @".{8}").Cast<Match>().Select(x => x.Value).OrderBy(x => x).GroupBy(g => g))
                output_8.Append($"{x.Key},{x.Count()}\n");
            File.WriteAllText(@"c:\work\words\output_8.txt", output_8.ToString());
я предположил, что это позволит мне собрать все варианты строк размерностью в 1 и в 8 символов соответственно, но как показала практика - это не так. Например в книге есть слово "newspaper" которое встречается дважды, но в выводе нет вариантов на 8 символов:
newspape
ewspaper
то есть я неправильно понимаю логику работы.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
14.11.2020, 12:07
belalugoci, мне кажется вы усложняете. Регуляркой просто собираете коллекцию слов, а дальше обрабатываете обычным кодом так как нравится.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.11.2020, 12:55  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
мне кажется вы усложняете
я просто абсолютно не понимаю как работает linq и regex, чтение манов кроме раскаления мозга результата не даёт.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,404
14.11.2020, 13:19
А что за словарь составляется и для какой цели?
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.11.2020, 13:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А что за словарь составляется и для какой цели?
изучаю LZ, Range Coding, Huffman + свои мысли и идеи проверить.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,404
14.11.2020, 13:52
belalugoci, тогда никакие LINQ и RegExp не применимы. Такие алгоритмы руками реализуются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2020, 13:52
Помогаю со студенческими работами здесь

Разбор исходного текста программы
Так вышло что в C# не разбираюсь, а сдать нужно. Помогите разобрать исходный текст программы построчно (приписать рядом что значит каждая...

Разбор текста с помощью регулярного выражения
Помогите пожалуйста, нужна регулярка которая из строки вида &quot;21 # 2.2.4.Комплект 8 # 17&quot; (вместо &quot;комплект&quot; может быть...

Регулярные выражения - построчный разбор текста, исправить код
Хотел написать для себя тестировщик регулярных выражений и что-то не получается, подскажите пожалуйста. Первый вариант: namespace...

QtextEdit возможность редактирования части текста и запрет перевода курсора на другие части текста
Добрый день. Посоветуйте пожалуйста, как можно реализовать такую штуку: есть QtextEdit, в нем задан текст, в тексте есть фиксированная...

Разбор строки на 3 части
Добрых вечеров... Бытий час пытаюсь разобрать строку типа: Премьера, 19-й день, 20.01.17 22:45 Необходимо вытащить всё после второй...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru