Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 6 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 14.03.11
Prihlásený: 02.08.23
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok NapísalOffline : 04.07.2012 14:28

Potreboval by som nakopnúť nejakým smerom, potrebujem vyhľadávať v texte ale tak, aby vrátil aj najpravdepodobnejšiu zhodu (nie len exaktnú zhodu...). Máte nejakú predstavu?


Offline

Skúsený užívateľ
Skúsený užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 11.01.09
Prihlásený: 23.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 04.07.2012 18:18

Neviem, ci sa nejaky taky algoritmus nenajde aj v STL ( osobne o takom neviem ), ale da sa na to ist stylom, ze sa budu prehladavat znaky a pocet spravnych znakov sa bude niekde uchovavat. Ak bude dostatocne velky, tak slovo sa bude povazovat za spravne. Narychlo som zbuchal nieco taketo:
Kód:
#include <iostream>
#include <vector>


using namespace std;


void findStringsWithMatch( string source, string keyword, vector<string> & allMatches )
{

    string  result;
    int     match, begin;


        // posuvame sa v zdrojovom retazci po znaku
    for ( int i = 0; i < source.length(); i++ )
    {
        match = begin = 0;

            // posuvame sa v hladanom retazci po znaku
        for ( int j = 0; j < keyword.length(); j++ )
        {
                // zistujeme, aka je zhoda na danej pozicii v zdrojovom retazci
            if ( source[i+j] == keyword[j] )
            {
                ( match == 0 ) ? ( begin = j + i ) : 0 ;
                match++;
            }
        }

            // ak je aspon 50% zhoda, uloz/vypis najdeny retazec
        if ( match > ( keyword.length() / 2 ) )
        {
            result = source.substr( begin, match );
            allMatches.push_back( result );
            //cout << result << endl;
        }
    }

}


int main()
{

    vector<string>   allMatches;


    findStringsWithMatch( "V tomto retazci sa bude vyhladavat", "retazec", allMatches );
    findStringsWithMatch( "zhod.....hodzhoda....ho...zoda...odazho", "zhoda", allMatches );

    for ( vector<string>::iterator i = allMatches.begin(); i != allMatches.end(); i++ )
        cout << *i << endl;

    return 0;

}


Vypis:
Citácia:
retaz
zhod
hod
zhoda
oda
oda
zho


ale samozrejme, ze to este nemusi byt podla vasich predstav. Napriklad, je nutne sa zamysliet, ako konkretne pozadujeme, aby sa vysledny najdeny retazec mal zhodovat s originalom. V tomto priklade sa povazuje za zhodu aj slovo "zhoda" a "oda", pretoze oda tvori viac ako 50% v slove zhoda. Je to ale akysi zaklad, ako by to mohlo vyzerat. Staci uz len doplnit, aby sa vypisalo len to, co je potrebne.


Offline

Užívateľ
Užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 14.03.11
Prihlásený: 02.08.23
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 10.07.2012 9:19

Ďakujem, idem sa s tým hrať. 8-)

Ja potrebujem hľadať napríklad 5 slov s tým, že nejaké mohlo byť vymazané alebo nejaké vložené medzi.


Offline

Skúsený užívateľ
Skúsený užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 11.01.09
Prihlásený: 23.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 10.07.2012 11:15

V tom pripade by tento kod mal fungovat, uz len zalezi, aky vysledok sa ma vratit, ci cele slovo ( napr ak je slovo "aaaretazecbbb" a ma sa najst slovo "retazec", aky vysledok sa ma vratit ako result ), v tomto priklade to vrati jednoducho len tu cast retazca, ktora sa hladala, ale ako som vravel, uz to snad nie je problem upravit si do pozadovaneho tvaru. Ak by bol problem, staci sa ozvat.


Offline

Užívateľ
Užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 14.03.11
Prihlásený: 02.08.23
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 11.07.2012 12:50

Ďakujem, zatiaľ to stačí takto.

Potrebujem vyhodnocovať % zhody a keďže sa výsledky môžu opakovať, budem hľadať najlepšiu zhodu v okolí zadaného miesta.

// pridané po 5 minútach od posledného príspevku

Fico píše:
V tom pripade by tento kod mal fungovat, uz len zalezi, aky vysledok sa ma vratit, ci cele slovo ( napr ak je slovo "aaaretazecbbb" a ma sa najst slovo "retazec", aky vysledok sa ma vratit ako result ), v tomto priklade to vrati jednoducho len tu cast retazca, ktora sa hladala, ale ako som vravel, uz to snad nie je problem upravit si do pozadovaneho tvaru. Ak by bol problem, staci sa ozvat.


S tým príkladom nie je problém :) , problém je ma sa najst slovo "retazec", a prehľadávaný text je "aaaretbbbazec" aby do zhody počítal aj druhú časť (t.j. aby sa vedel znovu zosynchronizovať). Keď to vie filecompare a textové editory, nejako sa to musí dať... (Napríklad regulárnymi výrazmi.)


Ale nemôžem si dovoliť veľké delo, musí to byť rýchle.

// pridané po 2 hodinách 54 minútach od posledného príspevku

Už som niečo našiel, hľadaqním "sentence similarity measure".

The Levenshtein distance between two strings is defined as the minimum number of edits needed to transform one string into the other, with the allowable edit operations being insertion, deletion, or substitution of a single character.


Offline

Skúsený užívateľ
Skúsený užívateľ
c++/cli vyhľadávanie textu

Registrovaný: 11.01.09
Prihlásený: 23.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 11.07.2012 15:13

Ak chcete pouzit regularne vyrazy, tak aj to sa da, len zial, v linuxe mi akosi nejde pouzit kniznicu regex v C++, tak ak postaci aspon kod v Cecku, s ceckovskou kniznicou regex.h ( ktora je zrejme len v linuxe, nie som si isty ):
Kód:
#include <stdio.h>
#include <string.h>
#include <regex.h>


int findStringInText( char* source, char* keyword )
{

    regex_t     regex;
    int         i, result, match;
    char        pattern[255];


    match = 0;
    pattern[0] = '\0';

        /* vygenerovanie regularneho vyrazu [^ ]*1[^ ]*2[^ ]*3[^ ]* ... atd */
    for ( i = 0; i < strlen( keyword ); i++ )
    {
        strcat( pattern, "[^ ]*" );
        strncat( pattern, keyword + i, 1 );
    }
    strcat( pattern, "[^ ]*" );

        /* zistenie zhody */
    result = regcomp( &regex, pattern, 0 );
    if ( result != 0 )
        return 0;

    result = regexec( &regex, source, 0, NULL, 0 );
    if ( result == 0 )
        match = 1;

    regfree( &regex );
    return match;

}



int main()
{

    if ( findStringInText( "aaaretbbbazecccc", "retazec" ) )
        printf( "Found it!\n" );
    else
        printf( "No match\n" );

    return 0;

}


Vystup:
Citácia:
Found it!


Odpovedať na tému [ Príspevkov: 6 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. c++/cli lexicograhical_compare padá na rovnakých údajoch

v Assembler, C, C++, Pascal, Java

0

341

18.07.2014 12:24

marian_r Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyhladavanie textu v knihach

v Ostatné programy

2

364

26.01.2012 12:51

Nemesis97 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Aky soft na vyhladavanie textu, zdrojoveho php kodu

v Ostatné programy

0

962

13.06.2006 16:52

Pufo Callo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. c++ formatovanie textu

v Assembler, C, C++, Pascal, Java

7

636

18.11.2010 15:07

masloslayer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C - rozdelenie textu do premenných

v Assembler, C, C++, Pascal, Java

12

549

29.04.2013 11:41

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. CLI screenshot

v Operačné systémy Unix a Linux

0

530

30.03.2011 18:01

riki137 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zmena textu a zanechani pozice v textu

v PHP, ASP

4

753

01.08.2009 21:26

Tominator Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Mám sa učiť C ++/objective C/ C#?

v Assembler, C, C++, Pascal, Java

5

730

08.07.2014 20:40

XOLOO Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyhladavanie

v PHP, ASP

5

471

25.04.2013 23:42

misko16 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyhladavanie

v Databázy

1

863

29.08.2009 11:30

bmatias Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyhladavanie

v Ostatné programy

4

703

30.06.2008 2:38

dedko45 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyhladavanie

v PHP, ASP

1

631

24.09.2010 20:22

VireL Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyhladavanie

v Delphi, Visual Basic

1

768

20.07.2009 19:25

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyhľadávanie

v HTML, XHTML, XML, CSS

15

2292

04.12.2007 13:15

wotan Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vyhladavanie

v Databázy

3

375

08.04.2014 9:45

JanoF Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. vyhladavanie

v Správy pre vedenie fóra

9

1035

19.04.2012 20:53

Jeffo Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra