Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Составление словаря текста с частотностью употребления / 22 сообщений из 22, страница 1 из 1
09.02.2016, 23:43
    #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
09.02.2016, 23:50
    #39167176
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление словаря текста с частотностью употребления
Да, я хотел на <regexp> сделать разбивку строки на слова, но оказалось, что в передовом во всех отношениях GCC
<regexp> не реализован, причём он есть в виде заголовков, но его нешаблонных функций в библиотеке CRT нет.
Вот такой прикол.
...
Рейтинг: 0 / 0
10.02.2016, 09:44
    #39167308
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление словаря текста с частотностью употребления
Круть.
...
Рейтинг: 0 / 0
10.02.2016, 13:38
    #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
10.02.2016, 23:10
    #39168100
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Составление словаря текста с частотностью употребления
Код: plaintext
1.
Я бы не вводил отдельно функцию tolower()



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


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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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