| | |
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
Autor | Správa |
---|
Registrovaný: 14.03.11 Prihlásený: 02.08.23 Príspevky: 814 Témy: 23 Bydlisko: Bratislava |
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?
|
|
Registrovaný: 11.01.09 Prihlásený: 23.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 14.03.11 Prihlásený: 02.08.23 Príspevky: 814 Témy: 23 Bydlisko: Bratislava | Napísal autor témy marian_r: 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.
|
|
Registrovaný: 11.01.09 Prihlásený: 23.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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.
|
|
Registrovaný: 14.03.11 Prihlásený: 02.08.23 Príspevky: 814 Témy: 23 Bydlisko: Bratislava | Napísal autor témy marian_r: 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 "aaa retbbb azec" 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íspevkuUž 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.
|
|
Registrovaný: 11.01.09 Prihlásený: 23.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 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( ®ex, pattern, 0 ); if ( result != 0 ) return 0;
result = regexec( ®ex, source, 0, NULL, 0 ); if ( result == 0 ) match = 1;
regfree( ®ex ); return match;
}
int main() {
if ( findStringInText( "aaaretbbbazecccc", "retazec" ) ) printf( "Found it!\n" ); else printf( "No match\n" );
return 0;
}
Vystup:
Citácia: Found it!
|
|
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| c++/cli lexicograhical_compare padá na rovnakých údajoch v Assembler, C, C++, Pascal, Java | 0 | 341 | 18.07.2014 12:24 marian_r | | Vyhladavanie textu v knihach v Ostatné programy | 2 | 364 | 26.01.2012 12:51 Nemesis97 | | Aky soft na vyhladavanie textu, zdrojoveho php kodu v Ostatné programy | 0 | 962 | 13.06.2006 16:52 Pufo Callo | | c++ formatovanie textu v Assembler, C, C++, Pascal, Java | 7 | 636 | 18.11.2010 15:07 masloslayer | | C - rozdelenie textu do premenných v Assembler, C, C++, Pascal, Java | 12 | 549 | 29.04.2013 11:41 BX | | CLI screenshot v Operačné systémy Unix a Linux | 0 | 530 | 30.03.2011 18:01 riki137 | | Zmena textu a zanechani pozice v textu v PHP, ASP | 4 | 753 | 01.08.2009 21:26 Tominator | | Mám sa učiť C ++/objective C/ C#? v Assembler, C, C++, Pascal, Java | 5 | 730 | 08.07.2014 20:40 XOLOO | | vyhladavanie v PHP, ASP | 5 | 471 | 25.04.2013 23:42 misko16 | | vyhladavanie v Databázy | 1 | 863 | 29.08.2009 11:30 bmatias | | vyhladavanie v Ostatné programy | 4 | 703 | 30.06.2008 2:38 dedko45 | | Vyhladavanie v PHP, ASP | 1 | 631 | 24.09.2010 20:22 VireL | | Vyhladavanie v Delphi, Visual Basic | 1 | 768 | 20.07.2009 19:25 Fico | | vyhľadávanie v HTML, XHTML, XML, CSS | 15 | 2292 | 04.12.2007 13:15 wotan | | Vyhladavanie v Databázy | 3 | 375 | 08.04.2014 9:45 JanoF | | vyhladavanie v Správy pre vedenie fóra | 9 | 1035 | 19.04.2012 20:53 Jeffo |
| 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
|
|