powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Составление словаря текста с частотностью употребления
22 сообщений из 22, страница 1 из 1
Составление словаря текста с частотностью употребления
    #39167173
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, накодил...
Цель -- пощупать современный С++, его новые возможности.
Потом бы ещё хотелось это же сделать в более функциональном стиле, но это потом.

Разделители подбирались и всё тестировалось на 1-ой книге Толстого "Война и мир".

Код: plaintext
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.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
#include <iostream>
#include <ostream>
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#include <map>
#include <algorithm>

static const wchar_t* WORD_DELIMITERS = L" \t\n\r!;:?()[]{}«»„…\".,";
                                                   // Инициализация вектора нескалярным инициализатором
static const std::vector< std::wstring > NONWORDS = { L"-", L"—", L"–", L"*"};

namespace std
{
    template<typename K, typename V>
    std::wostream &operator<<(std::wostream &o, const std::pair<K, V> &e)
    {
        o << L"[" << e.first << L"]=>" << e.second;
        return o;
    }

    template<typename T>
    std::wostream &operator<<(std::wostream &out, const std::vector<T> &v)
    {
        if (!v.empty())
        {
            out << '[';
            std::copy(v.cbegin(), v.cend(), std::ostream_iterator<T,wchar_t>(out, L",\n"));
            out << L"]\n";
        }
        return out;
    }

    template<typename K, typename V>
    std::wostream &operator<<(std::wostream &out, const std::map<K,V> &m)
    {
        if (!m.empty())
        {
            out << '{';
            std::copy(m.cbegin(), m.cend(), std::ostream_iterator< typename std::map<K,V>::value_type, wchar_t >(out, L",\n"));
            out << L"}\n";
        }
        return out;
    }
}

std::wstring tolower( const std::wstring &s )
{
    std::wstring r;
    std::transform( s.cbegin(), s.cend(), std::back_inserter(r),
      [] (const wchar_t &ch)  // а вот ЛЯМБДА! (безымянная функция оформленная в виде выражения)
      {
          return std::use_facet< std::ctype< wchar_t > >( std::locale("ru_RU.UTF-8") ).tolower( ch );
      }
    );
    return r;
}

template <typename K, typename V>
void printMap( std::wostream &out, const std::wstring &name, const std::map<K,V> &m )
{
    out << name << L".size() = " << m.size();
    out << L"\n";
    out << m << L"\n";
};

template <typename K, typename V>
void printMapSortedByValue( std::wostream &out, const std::wstring &name, const std::map< K, V > &m )
{
    std::vector< std::pair< K, V > > v(m.cbegin(), m.cend());
    std::sort( v.begin(), v.end(),
               // тоже лямбда
               [](const std::pair<K, V>& l, const std::pair<K,V>& r)
               { return l.second > r.second; } );

    out << name << L".size() = " << m.size();
    out << L"\n";
    out << v;
};

std::vector<std::wstring> splitLine(const std::wstring& input, const std::wstring& delimiters)
{
    std::vector<std::wstring> split;
    std::wstring::size_type next_start = 0;
    for( unsigned b = 0; next_start != std::wstring::npos && b < input.size(); b = next_start )
    {
        auto e = input.find_first_of( delimiters, b );
        if( e != std::wstring::npos )
        {
            const std::wstring &w = input.substr(b, e - b);
            split.push_back( w );
            next_start = input.find_first_not_of( delimiters, e );
        }
        else
        {
            const std::wstring &w = input.substr(b);
            split.push_back( w );
            next_start = std::wstring::npos;
        }
    }
    return split;
}

int main( int argc, char* argv[] )
{
    std::setlocale(LC_ALL, NULL);
    // this is needed in GCC for imbue( utf8 ) to work on wcout.
    std::ios_base::sync_with_stdio(false);
    std::locale utf8("ru_RU.UTF-8");

    if( argc < 2 )
    {
        std::wcout << L"Usage: wd filename" << std::endl;
        return -1;
    }

    std::wcout.imbue( utf8 );

    std::wifstream in( argv[1] );
    in.imbue( utf8 );

    std::wofstream output( std::string(argv[1]) + ".wd");
    output.imbue( utf8 );

    std::map< std::wstring, unsigned > wd;

    while( in.good() )
    {
        std::wstring ln;
        std::getline( in, ln, wchar_t('\n') );
        if( ln.empty() )
            continue;

        auto line_words = splitLine( ln, WORD_DELIMITERS );
        for( auto w : line_words )
        {
            if( w.empty() )
                continue;

            w = tolower( w );
            if( std::find( NONWORDS.cbegin(), NONWORDS.cend(), w ) == NONWORDS.cend() )
                ++(wd[w]);
        }
    }

    printMap( std::wcout, L"wd", wd );
    printMap( output, L"wd", wd );
    printMapSortedByValue( output, L"wd", wd );
    return 0;
}



----
Читал хинты оракла. Много думал...
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39167176
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я хотел на <regexp> сделать разбивку строки на слова, но оказалось, что в передовом во всех отношениях GCC
<regexp> не реализован, причём он есть в виде заголовков, но его нешаблонных функций в библиотеке CRT нет.
Вот такой прикол.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39167308
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круть.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39167562
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не вводил отдельно функцию tolower(). Мне кажется вся красота и лаконичность лямбд
заключается в том что они используются сразу по месту. А здесь идёт декларация
функций, временной переменной e.t.c.

ИМХО при таком подходе можно вертеть циклы и без лямбд.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
std::wstring tolower( const std::wstring &s )
{
    std::wstring r;
    std::transform( s.cbegin(), s.cend(), std::back_inserter(r),
      [] (const wchar_t &ch)  // а вот ЛЯМБДА! (безымянная функция оформленная в виде выражения)
      {
          return std::use_facet< std::ctype< wchar_t > >( std::locale("ru_RU.UTF-8") ).tolower( ch );
      }
    );
    return r;
}
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168100
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Я бы не вводил отдельно функцию tolower()



А я просто её долго не мог написать, поэтому их было две или три, через ICU, через iconv...
Можно и лямбдой, конечно.
Но в чём отличие (ещё одно) функций от лямбд ?
В том, что функции можно и нужно повторно использовать, а лямбды бесмысленны
без контекста, который их окружает.
Когда фунции сложнее придумать красивое, лаконичное и непротиворечивое название, чем её
написать, нужно использовать лямбды.


mayton Мне кажется вся красота и лаконичность лямбд заключается в том что они используются сразу по месту.

Красота лямбд в замыкании.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168102
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, тут же можно применить и замыкания !
Ура!
Ждите следующую версию...
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168107
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, нет, нельзя...
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168182
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУра!
Ждите следующую версию...

Ура
Предлагаю попробовать делать игры, тогда точно будем ждать следующую версию :)
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168206
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле мне плохо понятен код, но это мои проблемы. Но судя по используемым библиотекам и токену map, вы используете красно-чёрное дерево или что-то очень похожее, это так ?
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168478
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНа самом деле мне плохо понятен код, но это мои проблемы.

Так почитай, поизучай...

SashaMercury Но судя по используемым библиотекам и токену map, вы используете красно-чёрное дерево или что-то очень похожее, это так ?

Там используется стандартный std::map, да, он на дереве, и видимо на красно-чёрном. Какая собственно разница ?
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168597
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне хотелось понять принципиальную разницу по быстродействию с классической реализацией, без использования лямбда. Потому узнал про алгоритм

Изучу конечно, спасибо за интересный код C:
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168598
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbMasterZivУра!
Ждите следующую версию...

Ура
Предлагаю попробовать делать игры, тогда точно будем ждать следующую версию :)
При чем тут игры? Тут тема - пощупать С++ с нововведениями.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168671
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне хотелось понять принципиальную разницу по быстродействию с классической реализацией, без использования лямбда. Потому узнал про алгоритм

Изучу конечно, спасибо за интересный код C:
Лямбды - это не про это. Это способ выразительно описывать суть вещей.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168704
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. функция и лямбда выполняются с одинаковой скоростью ? Или их нельзя сравнивать по такому критерию, главное читабельность и выразительность в данном случае ?
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168732
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне хотелось понять принципиальную разницу по быстродействию с классической реализацией, без использования лямбда. Потому узнал про алгоритм

Изучу конечно, спасибо за интересный код C:
Лямбда -- это лишь элемент языка. Принципиально на бинарном уровне ничего не поменялось. Просто когда компилятор доходит до лямбды, он генерит класс-функтор с operator() и помещает в него код лямбды, заодно захватывает всё, что указано в списке захвата, помещает это в поля класса, к которым затем обращается код оператора вызова.
Можно считать это навороченным макросом, к которому применимы оптимизации.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39168742
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТ.е. функция и лямбда выполняются с одинаковой скоростью ? Или их нельзя сравнивать по такому критерию, главное читабельность и выразительность в данном случае ?
Насколько я разбираюсь в вопросе, лямбды созданы решать другую задачу.
Хотя перформанс с лямбдой может меняться. Этот забавные технический артефакт
можно изучить, продизассемблировав. Но не мне тебе рассказывать что на перформанс
влияют 1) выбор алгортма 2) опции компиллятора 3) исходные данные или их
статистические свойства.

Но в данном топике насколько я понимаю нас всех пока интересуют
возможности уровня языка и синтаксиса.

Оптимизация тоже интересна но я-бы пустил ее другим топиком чтоб не засорять.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39169162
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПри чем тут игры? Тут тема - пощупать С++ с нововведениями.Совместить весёлое с полезным. Игры тоже пишутся на C++ с использованием лямб.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39169277
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbmaytonПри чем тут игры? Тут тема - пощупать С++ с нововведениями.Совместить весёлое с полезным. Игры тоже пишутся на C++ с использованием лямб.
Ну давай совмещай. Ждём публикаций.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39169303
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ok :) есть у меня одна идейка
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39169968
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТ.е. функция и лямбда выполняются с одинаковой скоростью ? Или их нельзя сравнивать по такому критерию, главное читабельность и выразительность в данном случае ?

безусловно с одной скоростью.
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39170061
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХотя перформанс с лямбдой может меняться.


с чего вы взяли, что то, как функция оформлена, должно влиять на её скорость работы?
...
Рейтинг: 0 / 0
Составление словаря текста с частотностью употребления
    #39170099
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonХотя перформанс с лямбдой может меняться.


с чего вы взяли, что то, как функция оформлена, должно влиять на её скорость работы?
Это всё мои мечты об inline expansion. Как оно на самом деле будет - ХЗ.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Составление словаря текста с частотностью употребления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]