= Kontrola duplicit = #Kontrola_duplicit-1 [[BR]] Tento článek popisuje hledání a odstranění duplicitních dokumentů v korpusech. = Úvod = #A.2BANo-vod == Co jsou to duplicitní dokumenty - vysvětlení termínů == #Co_jsou_to_duplicitn.2BAO0_dokumenty_-_vysv.2BARs-tlen.2BAO0_term.2BAO0-n.2BAW8- * ''Korpus'' je složen z jednoho nebo více vertikálů. * ''Vertikál'' je textový soubor ve formátu XML, navíc členěný na řádky. Každý vertikál obsahuje jeden nebo více dokumentů. * ''Dokument'' je část vertikálu mezi značkami a . * ''Identifikátor'' dokumentu je hodnota atributu id značky doc a je jednoznačný v celém korpusu. * ''Duplicitní dokumenty'' jsou dva nebo více různých dokumentů (s různými identifikátory) mající stejný nebo téměř stejný obsah. Příčiny duplicit jsou: * Některé zdroje byly omylem zařazeny do korpusu vícekrát. * Některé články jsou zvěřejněny vícekrát v různých zdrojích (zprávy ČTK v různých denících). * Některé články jsou si velmi podobné (kurzovní lístky, předpovědi počasí). Našim cílem je vyřešit tento problém. Což znamená: * Smazat ty dokumenty, které byly omylem zařazeny vícekrát. * Označit fakt, že některé dokumenty jsou si velmi podobné, a že pro další zpracování chceme použít jen jeden z nich. = Hledání duplicitních dokumentů = #Hled.2BAOE-n.2BAO0_duplicitn.2BAO0-ch_dokument.2BAW8- Zkoumáme-li zda dva dokumenty jsou duplicitní můžeme použít různě přísná kritéria. Nejjednodušší řešení je prosté porovnání: dokumenty uložíme do souborů a použijeme příkaz `cmp`. Je ale nutné abychom nebrali v úvahu řádek se značkou ``, protože různé dokumenty mají vždy různé identifikátory. Toto můžeme vyřešit pomocí příkazu `grep -v '^ Špidla

Ministr práce a sociálních věcí

}}} Dokument 2: {{{ Špidla

Ministr práce a sociálních věcí

}}} Dokument 3: {{{

Špidla Ministr práce a sociálních věcí

}}} Dokument 4: {{{

Špidla - ministr práce a sociálních věcí

}}} Považujme dokument 1 za základní. [http://nlp.fi.muni.cz/cs/BR BR]Dokument 2 je s ním zcela identický až na to, že se liší v identifikátoru. [http://nlp.fi.muni.cz/cs/BR BR]Dokument 3 se od dokumentu 1 liší v použitých značkách - tento rozdíl vzniká typicky pokud převod provádějí rozliční autoři - autor dokumentu 3 byl při převodu evidentně méně pečlivý. [http://nlp.fi.muni.cz/cs/BR BR]Dokument 4 se od dokumentu 1 liší v použitých značkách, ale i v pozicích - obsahuje navíc pomlčku a slovo ministr má malé počáteční písmeno. == Signaturní funkce == #Signaturn.2BAO0_funkce Výše zmíněný způsob hledání duplicit odhalí jako duplicitní jen dokumenty 1 a 2. Metoda pro odhalování duplicitních dokumentů je taková, že pomocí nějakého filtru - signaturní funkce aplikovaného na zkoumané dokumenty si vyrobíme otisky (signatura, fingerprint) a testujeme, zda jsou tyto otisky identické. Pokud ano, říkáme, že tyto dokumenty jsou duplicitní vzhledem k dané signaturní funkci. Základní signaturní funkce jsou: * ''Identita až na jméno dokumentu:'' realizována filtrem [[BR]] `grep -v '^$'` * ''Signatura dokumentu:'' realizována filtrem [[BR]] `grep -v '^<.*>$'|cstocs il2 ascii|tr "A-Z" "a-z" | tr -cd "a-z"| hashovaci_funkce ` [[BR]] Tedy tato funkce je realizována kolonou, která odstraňuje značkování dokumentu, potom písmena české abecedy převede na ASCII, potom velká písmena převede na malá, potom odstraní vše kromě malých písmen z množiny [a-z] a tento výsledek zkrátí pomocí pro tento účel vytvořené hashovací funkce na maximálně osmimístné hexadecimální číslo. Toto číslo se nazývá signatura dokumentu a je uloženo v metainformacích v atributu T_Signat. Například: {{{ T_Sub: 1A35C6DC }}} Pro morfologicky značené korpusy (DESAM) je vhodné na začátek kolony přidat příkaz `cut -f1`, který odstraní morfologické značky, které jsou oddělěny tabulátorem. Takže pro morfologicky značený korpus získáme například tuto signaturní funkci: [[BR]] `cut -f1 | grep -v '^ vertikal.list }}} Pak tento seznam setřídíme podle signatury, tím se stejné signatury seřadí za sebe a obdobou programu uniq ponecháme jen jeden z duplicitních dokumentů a nakonec vybereme 4. až 6. sloupec pro list2vert, který ze slušnosti setřídíme podle souboru a můžeme spustit encode: {{{ $ cat vertikal.list | sort -t: -k1,1 | repeated_lines --delimiter=: --output=uniq --field=1 | cut -d: -f4-6 | sort -t: -k3,3 | list2vert | encode }}} To je nejjednodušší způsob, jak se vypořádat s duplicitama.