Цепи Маркова на с++

Тема в разделе "Другие языки", создана пользователем google_master, 5 фев 2008.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. google_master

    google_master Создатель

    Регистр.:
    26 янв 2007
    Сообщения:
    49
    Симпатии:
    14
    Нужны исходники цепей Маркова на с++ для генерации текста. Может есть у кого варианты какие-то? :)
     
  2. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    неуж-то сишник не разберет php код
    PHP:
    //Файл, в котором лежит исходный текст 
    $source_text 'text.txt'
    //Наш словарь соответствия слова и идущих за ним слов 
    $dictionary = array(); 

    function 
    load() 

       global 
    $dictionary,$source_text
       
    //Читаем исходный файл 
       
    $str file_get_contents($source_text); 
       
    //Превращаем текст в одну строку 
       
    $str preg_replace("#[\r\n]#","",$str); 
       
    //Выделяем все слова из строки (выражение в кавычках или в скобках считается одним словом) 
       
    preg_match_all("#((\"[^\"]+\")|(\([^\)]+\))|([^\(\)\"'\s]+))(\s+|\z)#",$str,$parts); 
       
    $words $parts[1]; 
       
    $count count($words); 

       
    //Заполняем словарь 
       
    for( $i 0$i $count$i++ ) 
       { 
          if( 
    $i 
          { 
             if( !
    in_array($words[$i],$dictionary[$prev_word]) ) 
                
    $dictionary[$prev_word][] = $words[$i]; 
          } 
          
    $prev_word $words[$i]; 
          if( empty(
    $dictionary[$prev_word]) ) 
             
    $dictionary[$prev_word] = array(); 
       } 


    //Функция генерации текста. $count - количество генерируемых слов 
    function genText($count

       global 
    $dictionary
       
    $words array_keys($dictionary); 
       
    $word $words[0]; 
        
       
    $text =''
       for( 
    $i 0$i $count$i++ ) 
       { 
          
    $text .= ' '.$word
          
    //Следующее слово - случайное слово из тех, что идут в исходном тексте за текущим словом 
          
    $word $dictionary[$word][rand(0,count($dictionary[$word])-1)]; 
       } 
       return 
    $text


    load(); 
    echo 
    genText(100);


    Добавлено через 6 минут
    Перейти по ссылке

    15.3. Порождение текста
     
  3. Brux

    Brux

    Регистр.:
    25 сен 2007
    Сообщения:
    155
    Симпатии:
    9
    а зачем цепи маркова, они уже выходят из моды, уже люди начали ориентироватся на другие алгоритмы генерации.
     
  4. itex

    itex

    Регистр.:
    15 ноя 2007
    Сообщения:
    274
    Симпатии:
    64
    А какие алгоритмы сейчас в моде?
     
  5. google_master

    google_master Создатель

    Регистр.:
    26 янв 2007
    Сообщения:
    49
    Симпатии:
    14
    Не могу переписать это на с++ :(
     
  6. rex1963

    rex1963

    Регистр.:
    19 фев 2007
    Сообщения:
    228
    Симпатии:
    47
    Я выкладывал на форуме программу Delirium. Там открытые исходники. Юзай поиск.
     
  7. google_master

    google_master Создатель

    Регистр.:
    26 янв 2007
    Сообщения:
    49
    Симпатии:
    14
    Не могу понять, как пользоваться source, помогите пожалуйста. см. аттач

    http://depositfiles.com/files/3412124
    Перейти по ссылке
     
  8. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    и в чем проблема?

    файл chains.h - объявление функций для работы с цепями
    PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>

    #include "windows.h"
    #include "commctrl.h"

    #include "resource.h"

    #define DEF_IGNORE "@#^_;:\\|/<>~"

    int mainproc(HWND hWndchar **innamesint intotalchar *outname);
    void SetPercentage(HWND hWndint total);
    int wordcount(FILE *in, const char *clear);
    void insert(const char *KeyAndWordstruct KeyEntry **StoreStruct);
    //вставка ключа и слова в базу
    char *randword(const char *Keystruct KeyEntry **StoreStruct);
    //случайное слово из базы
    void processfile(HWND hWndFILE *instruct KeyEntry **WordStructstruct KeyEntry **BonusWordStruct, const char *clear);
    //создание базы на основе файла, clear - ненужные символы
    void createdelirium(HWND hWndFILE *outstruct KeyEntry **WordStructstruct KeyEntry **BonusWordStruct, const char *start, const int length);
    //создание бреда из не более length слов
    unsigned int strhash(const char *s);
    //хеш строки, не более max_hash - лучше заменить на что-то более продвинутое или хватит и такого

    struct StringListItem{
        
    char *String;
        
    struct StringListItem *Next;
    };

    struct KeyEntry{
        
    char *Key;
        
    struct KeyEntry *Another;

        
    struct StringListItem *Word;
        
    unsigned int NumberOfFollowers;

    };
    и файл chains.cpp реализация этих функций
    PHP:
    /*
    Нам говорят "безумец" и "фантаст",
    Но, выйдя из зависимости грустной,
    C годами мозг мыслителя искусный
    Мыслителя искусственно создаст.
                           Гете
    */

    #include "chains.h"


    const char blanks[] = "\n\r\t";
    char punctuation[] = DEF_IGNORE;//все знаки препинания;
    char keybonused[1024];
    int max_hash 32;//максимальное значение хеша
    int hash_exp 15;//показатель степени
    int totalwords 0;
    int keywords 2;
    int max_length 1000;
    int key_bonus 4;
    int ranseed 0;
    bool tech true;

    unsigned int strhash(const char *s){
        
    // (c) K&R
        
    unsigned int hashval;

        for (
    hashval 0; *!= '\0's++)
            
    hashval = *31 hashval;
        return 
    hashval max_hash;
    }

    inline void SetPercentage(HWND hWndint currentint total){
        static 
    int prev 0prevtotal 0;

        const 
    int smooth 10//В процентах, насколько гладко идет прогрессбар

        
    if(total != prevtotal){
            
    prev 0;
            
    prevtotal total;
        }

        if ((
    current prev) >= smooth * (total 100))
            
    SendMessage(hWndPBM_SETPOS, ((prev current) * 100) / total0);
        
    }

    char *randword(const char *Keystruct KeyEntry **StoreStruct){
        
    struct KeyEntry *KeyIns;
        
    struct StringListItem *WordIns;
        
    int randnum 0;

        if(
    StoreStructstrhash(Key)]){
            for(
    KeyIns StoreStructstrhash(Key)]; KeyIns && strcmp(KeyIns -> KeyKey); KeyIns KeyIns -> Another);
            if(!
    KeyIns || strcmp(KeyIns -> KeyKey)){
                return 
    NULL;
            }

            
    randnum = (KeyIns -> NumberOfFollowers) - (rand() % KeyIns -> NumberOfFollowers) - 1;


            for(
    WordIns KeyIns -> Wordrandnum 0WordIns WordIns -> Nextrandnum--;
            
            return 
    WordIns -> String;
        }

        return 
    NULL;
    }

    void insert(const char *KeyAndWordstruct KeyEntry **StoreStruct){
        
    char Key[1024] = {0}, Word[1024];
        
    struct KeyEntry *KeyIns;
        
    bool init false;
        
    struct StringListItem *WordIns;

        
    //разваливаю в ключ и слово
        
    strncpy(KeyKeyAndWordstrrchr(KeyAndWord' ') - KeyAndWord);
        
    strcpy(Wordstrrchr(KeyAndWord' ') + 1);

        if(
    StoreStructstrhash(Key)]){
            
    KeyIns StoreStructstrhash(Key)];
            while(
    strcmp(KeyIns -> KeyKey)){
                if(
    KeyIns ->AnotherKeyIns KeyIns ->Another;
                else break;
            }

            if(
    strcmp(KeyIns -> KeyKey)){
                
    KeyIns = (KeyIns -> Another = (struct KeyEntry*) malloc(sizeofstruct KeyEntry)));
                
    init true;
            }
        } 
        else{
            
    //инициализируем
            
    KeyIns = (StoreStructstrhash(Key)] = (struct KeyEntry*) malloc(sizeofstruct KeyEntry)));
            
    init true;
        }

        if(
    init){
            
    strcpy(KeyIns -> Key = (char*) calloc(strlen(Key) + 1sizeof(char)), Key);
            
    KeyIns -> Another NULL;
            
    KeyIns -> Word NULL;
            
    KeyIns -> NumberOfFollowers 0;
        }
        
    KeyIns -> NumberOfFollowers++;
        
    //добавляю слово в KeyIns -> Word
        

        
    WordIns = (struct StringListItem*) malloc(sizeofstruct StringListItem));
        
    strcpy(WordIns -> String = (char*) calloc(strlen(Word) + 1sizeof(char)), Word);
        
    WordIns -> Next KeyIns -> Word;
        
    KeyIns -> Word WordIns;
        

    }

    int wordcount(FILE *in, const char *clear){
        
    char currentlast ' ';
        
    int spaces 0;

        while ((
    current fgetc(in)) && (!(feof(in)))){
            if(
    strchr(clearcurrent)){
                
    current ' ';
            }
            if (!((
    current == ' ') && (last == ' '))){
                if(
    current == ' 'spaces++;
            }

            
    last current;
        }

        
    rewind(in);
        return 
    spaces;
    }

    void firstkey(FILE *inchar *Key, const char *clear){
        
    char currentlast ' ';
        
    int copied 0spaces 0;

        while ((
    current fgetc(in)) && (!(feof(in)))){
            if(
    strchr(clearcurrent)){
                
    current ' ';
            }
            if (!((
    current == ' ') && (last == ' '))){
                if(
    current == ' 'spaces++;

                if (
    spaces == keywords){
                    
    Key[copied] = '\0';
                    return;
                }

                
    Key[copied++] = current;
                
    last current;
            }
        }


    }

    void processfile(HWND hWndFILE *instruct KeyEntry **WordStructstruct KeyEntry **BonusWordStruct, const char *clear){
        
    char NewWords[1024], currentlast ' ';
        
    char *specialstart, *special;
        
    int copied 0spaces 0total 0allwords wordcount(inclear);

        while ((
    current fgetc(in)) && (!(feof(in)))){
            if(
    strchr(clearcurrent)){
                
    current ' ';
            }
            if (!((
    current == ' ') && (last == ' '))){
                if(
    current == ' 'spaces++;

                if (
    spaces == keywords 1){
                    
    NewWords[copied] = '\0';
                    
    insert(NewWordsWordStruct);

    //если последнее слово в NewWords входит в keybonused, добавить NewWords в BonusWordStruct
                    
    if( ((specialstart strstr(keybonusedspecial strrchr(NewWords' ') + 1)) != NULL)){
                        if( ((
    specialstart == keybonused) || (*(specialstart 1) == ' ')) && ((*(specialstart strlen(special) ) == ' ') || (*(specialstart strlen(special) ) == '\0'))){
                            
    insert(NewWordsBonusWordStruct);
                        }
                    }


                    
    SetPercentage(hWndtotal++, allwords);

                    
    strcpy(NewWordsstrchr(NewWords' ') + 1);
                    
    spaces keywordscopied strlen(NewWords);
                }

                
    NewWords[copied++] = current;
                
    last current;
            }
        }

        
    rewind(in);
    }

    void clearstore(struct KeyEntry **StoreStruct){
        
    struct KeyEntry *KI, *KIP 0;
        
    struct StringListItem *WI, *WIP 0;
        for(
    int i 0max_hashi++){
            for(
    KI StoreStructi]; KIKI = (KIP KI) -> Another){
                
    free(KI -> Key);
                
    free(KIP);
                for(
    WI KI -> WordWIWI = (WIP WI) -> Next){
                    
    free(WI -> String);
                    
    free(WIP);
                }
                
    free(WI);

            }
            
    free(KI);
        }
        
    free(StoreStruct);
    }

    void createdelirium(HWND hWndFILE *outstruct KeyEntry **WordStructstruct KeyEntry **BonusWordStruct, const char *start, const int length){
        
    int i;
        
    char Key[1024], *Word;

        
    strcpy(Keystart);
        
    fprintf(out"%s "Key);
        for(
    0<= lengthi++){
            
    SetPercentage(hWndilength);
            if(((
    rand() % 10) < key_bonus) && (Word randword(KeyBonusWordStruct))){}
            else if(!(
    Word randword(KeyWordStruct))) return;
            
    fprintf(out"%s "Word);
            
    strcpy(Keystrchr(Key' ') + 1);
            
    sprintf(Key"%s %s"KeyWord);
        }
    }

    int mainproc(HWND hWndchar **innamesint intotalchar *outname){
        
    hWnd GetDlgItem(hWndIDC_PROGRESS);
        
        
    long start clock();

        
    FILE *in, *out;
        
    bool truerandom false;
        
    int i;

        if(  !(
    out fopen(outname"w"))){
            return -
    1;//файлы кривые 
        
    }

        if( 
    intotal 0){
            
    fclose(out);
            return -
    1;//файлы кривые 
        
    }

        
    char FKey[1024] = {0};
        if(
    truerandom = !ranseedranseed time(NULL) % RAND_MAX;
        
    srand(ranseed);

        
    char *clear = (char*) mallocstrlen(blanks) + strlen(punctuation) + 1);
        
    strcpy(clearblanks);
        
    strcat(clearpunctuation);

        if(
    tech){
            
    fprintf(out"---===[Файл создан программой Delirium 1.8]===---\r\n");
            
    fprintf(out"Параметры программы:\r\n");
            for(
    0<= intotali++)
                
    fprintf(out"\tВходной файл %d: %s\r\n"1innames[i]);
            
            
    fprintf(out"\tВыходной файл: %s\r\n"outname);
            
    fprintf(out"Настройки эксперта:\r\n");
            
    fprintf(out"\tКоличество ключевых слов: %d\r\n"keywords);
            
    fprintf(out"\tПоказатель размера хеш-таблицы: %d\r\n"hash_exp);
            
    fprintf(out"\tСемя генератора случайных чисел: %d\r\n"ranseed);
            
    fprintf(out"\tУвеличить частоту слов: %s\r\n"keybonused);
            
    fprintf(out"\tБонус частоты слов: 0.%d\r\n"key_bonus);
            
    fprintf(out"\tИгнорируемые символы: %s\r\n"punctuation);
            
    fprintf(out"\tГенерировать текст не более %d слов\r\n"max_length);
            
    fprintf(out"---===[    Конец технической информации   ]===---\r\n\r\n");
            
        }

        
    max_hash int(pow(2hash_exp));
        
    struct KeyEntry **StringPairs = (struct KeyEntry**) calloc(max_hashsizeof(struct KeyEntry**));
        
    struct KeyEntry **BonusStringPairs = (struct KeyEntry**) calloc(max_hashsizeof(struct KeyEntry**));


        for(
    0<= intotali++){
                if(  !(
    in fopen(innames[i], "r"))){
                
    fclose(out);
                return -
    1;
            }
            if( 
    == 0firstkey(inFKeyclear);
            
    rewind(in);
            
    processfile(hWndinStringPairsBonusStringPairsclear);
            
    fclose(in);
        }

        
    //PostMessage(hWnd, PBM_SETRANGE, 0, MAKELPARAM(0, max_length - 1));
        //PostMessage(hWnd, PBM_SETPOS, 0, 0);
        
    createdelirium(hWndoutStringPairsBonusStringPairsFKeymax_length);
        
        if(
    tech){
            
    fprintf(out"\r\n\r\n---===[Файл создан программой Delirium 1.8]===---\r\n");
            
    fprintf(out"\tВремя работы программы: %f секунд\r\n"float(clock() - start)/CLOCKS_PER_SEC);
            
    fprintf(out"---===[    Конец технической информации   ]===---\r\n");
        }

        
    fflush(out);
        
    fclose(out);
        
    clearstore(StringPairs);
        
    clearstore(BonusStringPairs);
        if(
    truerandomranseed 0;
        return 
    0;//все тип-топ
    }
     
  9. google_master

    google_master Создатель

    Регистр.:
    26 янв 2007
    Сообщения:
    49
    Симпатии:
    14

    А как мне это использовать в c++ builder? Хотел функцию типа: AnsiString markov(AnsiString text;int keys_from;int keys_to)
     
  10. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    :(
    разбирай функцию processfile

    готовый код тебе никто давать не будет. Неужеди трудно перенести код с VC++ в борланд ?

    PS имхо RTFM и учи матчасть
     
Статус темы:
Закрыта.