Portál AbcLinuxu, 10. května 2025 02:28

Dotaz: Pokročilé porovnání textů

7.4.2012 08:45 Iohannes
Pokročilé porovnání textů
Přečteno: 1054×
Odpovědět | Admin

Dobrý den,

pracuji s různými textovými variantami středověkých traktátů, které se snažím porovnávat. Výchozí texty se k sobě mají přibližně tímto způsobem:

Text 1 Text 2
- část a
- kus části d
- část b - část c
- část c - něco úplně jiného
- část d - část a
- část e - další kus části d

Rád bych tyto dva textové soubory porovnal a zjistil, které části sobě odpovídají. Problém je v tom, že použiji-li Kompare (na základě Diff-u), jsou soubory porovnány pouze lineárně od začátku do konce, tj. program hlásí, že si texty vůbec neodpovídají. V podstatě stejně to dopadne v případě, že porovnávám texty v Lyxu, ve kterém s nimi pracuji.

Neznal by někdo řešení? Předem děkuji za rady!

 

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.4.2012 23:07 d.c. | skóre: 30
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zdravim kolegu!

Bylo by to na delsi povidani. Jsou (nejmene) dva zakladni problemy:

1. Pocitace jsou zvykle pracovat s jasnymi daty, takze i interpunkce, decentni chyba pri opisovani ci rozpoznavani textu (at uz ve stredoveku nebo v "nasi dobe") zpusobi odlisnost. "Podobnost" pocitace vcelku neuznavaji. Tim se clovek od strojoveho vyhodnocovani dostava k heuristice.

2. Textove utility jsou orientovany radkove, coz realnym textum rozhodne neodpovida, takze s jinak bohatou a velmi dobre vyuzitelnou vybavou programku na zpracovani holeho textu clovek neuspeje.

Takze spise byste potreboval napriklad rozebrat texty na tokeny (male soucasti po slovech nebo skupinach slov) a s nimi pak pracovat. Ja bohuzel v posledni dobe "vedu" ve svem oboru nepraktikuji, takze nemam prehled hotovem o SW, ktery by to umel.
8.4.2012 02:52 l4m4
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Proč by počítače neuznávaly podobnost? Jen je zapotřebí podobnost definovat, což není tak zjevné a jednoznačné jako u stejnosti. Existuje spousta implementací editační vzdálenosti a dalších vzdáleností řetězců a měr podobnosti, což umožňuje třeba identifikovat blok v textu, který se nejvíc podobá [podle konkrétní definice] nějakému jinému textu. Akorát se tyhle věci spíš najdou ve specializovaných knihovnách než v běžných textových editorech. Mj. také proto, že je často zapotřebí šít řešení na míru konkrétnímu problému -- např. vyhledávání plagiátů.

Celkově jsem tedy nic neporadil, hotové řešení pro tento konkrétní problém bez nutnosti cokoli doprogramovat neznám. Něco by šlo poměrně snadno splácat např. pomocí SequenceMatcher v pythonu (i když jeho definici podobnosti zrovna nepovažuji za nejlepší).
pavlix avatar 8.4.2012 11:30 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
2. Textove utility jsou orientovany radkove, coz realnym textum rozhodne neodpovida, takze s jinak bohatou a velmi dobre vyuzitelnou vybavou programku na zpracovani holeho textu clovek neuspeje.
word diff
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
AraxoN avatar 8.4.2012 08:35 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Niektoré vysoké školy majú systém proti plagiátom, aby študenti neodpisovali z cudzích prác. Tam by sa dalo inšpirovať. Pokiaľ som to pochopil správne, používajú sa na to takzvané n-gramy, pričom ako základná jednotka sa berú celé slová. Text sa teda rozbije na slová a uložia sa postupnosti N-slov. Ak sú slová v texte napr. "A B C D E", 3-gramy z nich by boli "A B C", "B C D" a "C D E". Druhý text sa potom rozbije rovnako a hľadajú sa zhodné n-gramy z prvého textu. Keď sú skopírované celé pasáže, vyjde veľa zhodných n-gramov, ktoré idú po sebe. Potom už je to len vec toho, zvoliť správne n (pre rôzne jazyky môže byť rôzne), tak aby nebolo veľa false-positives.
8.4.2012 09:22 Iohannes
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin

Děkuji za všechny odpovědi. Uvědomuji si, že program, který by byl s to se vyrovnat i s drobnými odchylkami textů, je poměrně specializovaný a složitý, ale pro začátek by mi stačil porovnávač, který by se dokázal vypořádat s tím, že jednotlivé textové bloky jsou v jiném pořadí (tj. neporovnával by text pouze lineárně od shora dolů).

Teď se mi podařilo najít něco takového (třebas nedokonalého) pro Windows pod názvem Xtreme Content Checker, ale přiznám se, že jednak se mi tak aplikace moc nelíbí, jednak bych dal přednost něčemu pod Linuxem (ideálně otevřenému).

8.4.2012 09:59 d.c. | skóre: 30
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Na praci s textem rozlozenym na tokeny a usporadanym do databaze existoval program Marko http://freecode.com/projects/marko, ale kdovi, kde je mu konec. Nehledal jsem pravda nijak dukladne... Jsou dalsi programy, ktere obsahuji technologii, ktera by sla pouzit (ale uz tezko bez uprav a/nebo dalsiho programovani) - treba CRM114 Dr. Yerazunise.

Mozna by alespon neco jednodussiho umel nejaky z alternativnich/pohodlnejsich diffu. Treba hledat po slovech misto po radcich umi wdiff nebo dwdiff. Nektere veci umi Diffuse.
8.4.2012 11:04 Iohannes
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů

Děkuji za tip. Bohužel onen program Marko je nedostupný a programátorsky bohužel nejsem tak zdatný, abych jiný program sám upravil. Wdiff či Diffuse jsou sice pěkné programy, ale bohužel též nezvládají nelinární uspořádání duplicit. Každopádně děkuji za pomoc. Holt zatím se manuální práci nevyhnu...

pavlix avatar 8.4.2012 11:36 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Podle mě, pokud počítáš s dostatkem paměti, tak stačí třeba v Pythonu rozsekat text na slova. To je práce ja dva řádky kódu, kdy třeba regulárním výrazem určíš buď jak má vypadat slovo nebo jak má vypadat oddělovač (třeba vše, co není písmeno podle databáze Unicode).

A pak na tom můžeš programovat porovnání dle vlastních představ. Nejdřív můžeš porovnávat slova každé z prvního s každým z druhého a pak napočítat kolik dalších slov se shoduje. Pak můžeš doimplementovat ještě podobnost slov a podobnost frází.

Celé to jde udělat parametrizovatelné. Tak jako tak nejvíc času strávíš testováním a dodefinováváním toho, jak se to má podle tebe v různých případech chovat.
Holt zatím se manuální práci nevyhnu...
Bohužel.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
8.4.2012 21:36 d.c. | skóre: 30
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů

Bohužel onen program Marko je nedostupný.

Uznavam, ze to neni zrovna duveryhodny zdroj, ale pro informaci, zda se o to zajimat ci ne asi staci: http://www.sourcefiles.org/Miscellaneous/marko-1.1.tar.bz2
8.4.2012 22:44 Iohannes
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Děkuji, uvidím, jestli se mi to povede zprovoznit a co to bude umět.
8.4.2012 11:46 lada
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin
A co každý odstavec prohnat fourierovkou a pak už jen zjistit korelaci jednotlivých fourierových transformací (odstavců)?
8.4.2012 22:13 Michal2
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
To je _hodne_ sileny napad :-)

Softum na odhalovani plagiatu bych daval nejvetsi sanci.
12.4.2012 18:59 lada
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Příloha:
Není to nic geniálního, ale je to schopné porovnat úseky textu napříč dokumentem a zjistit, jestli se části neopakují.

Pokud trochu rozumíte matlabu, bude pro vás hračka si to upravit třeba pro porovnávání celých slov místo porovnávání frekvenčních charakteristik jednotlivých znaků v zadaném textu, což dělá tento paprogram.

Pro jeho správné použití je nutno do 'programu' zadat název zpracovávaného textového souboru (čistě textový soubor, žádný dokument) a počet částí, na které se má soubor rozdělit. Takto vzniklé bloky textu se potom proženou fourierovou transformací a vypočítají se vzájemné korelační koeficienty jednotlivých bloků. Počet částí je nejlepší prostě otestovat a dívat se na vykreslenou mapu nebo hodnoty korelačních koeficientů. Hodnota 1 znamená, že bloky jsou stejné.

Snad vám to k něčemu bude.
rADOn avatar 12.4.2012 19:25 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Pokročilé porovnání textů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli tomu dobre rozumim tak potrebujes v podstate jen naucit stary dobry diff pracovat s jinymi oddelovaci radku (regex?)… Ve druhe iteraci bych slova nahradil vystupem foneticke indexovaci funkce (soundex?) coz by mohlo zachytit i mensi preklepy.
"2^24 comments ought to be enough for anyone" -- CmdrTaco

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.