Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity

Sháním dobrý program na následující úkol:
Stručně :Mám asi 5 souborů, které chci sloučit do jednoho, co řádek, to záznam, nechci duplicity a chci detekovat "podobné" záznamy (například  ignorovat interpunkce a porovnávat jen slova složená z písmen, a substringy těchto písmen).
životní cyklus souboru je, že se postupně  k němu přidávají řádky (v tomto ohledu to připomíná log),. ale zároveň mohou být záznamy upravovány (drobně, například odmazání části, nahrazení něčeho hvězdičkou - ve smyslu zobecnění-upřesnění, něco jako regulerní výrazy  účelem, ne až tak syntaxí), mazány

 Zároveň mezi soubory může být vazba,  že druhý soubor vznikl zkopírováním prvního a od té doby si oba žijí vlastním životem (bylo k nim přidáváno dle odstavce výše, občas něco smazáno nebo upraveno, občas něco vloženo ne na konec, ale doprostřed)

 kde na každém řádku je záznam (případně nad každým řádkem je nepovinně komentář, který nemá nosnou informaci, ale poslouží jako reference, jak záznam vznikl, dá se říct něco jako unikátní klíč ; ale pozor, samotný hlavní řádek mohl být upraven


Jedná se o 5-7 souborů, každý o 400-1500 záznamech ( na řádky přepočteno = přibližně krát 3 : záznam + komentář + prázdný řádek)

Hledám nějaký program, (diff vážně ne), ve kterém by se toto dalo analyzovat, najít odlišné části, společné části, téměř společné části, a vyznačit je, prostě usnadnit kompilaci do jednoho výsledného souboru.  Myslím  tím nějaké "textové studio", hlavní funkce je
-porovnat 2 soubory (napadá mě, že základem workflow je vždy dvojice souborů, porovnávat trojici a víc by bylo otrocké)
-vyznačit ty části, které jsou stejné, odlišné podobné
-skrýt společné řádky
-najít společné řádky ( i na přeskáčku)
- najít podobnosti například /var/salamandr a ^salamandr/*
- nalezení "nejmenšího společného násobku" - nalezení společných částí ne jen v dané dvojici, ale postupně i v trojici až ve všech zkoumaných souborech



Duplicity (plus "podobnosti") v cílovém souboru nejsou vyloženě na škodu, ale nechtěl bych, aby tam půlka záznamů
byla 4x.

Případně jak to dělat ručně a s jakými existujícími nástroji a jakým workflow.
« Poslední změna: 04. 09. 2019, 11:05:56 od Pivotal »


mhepp

  • ***
  • 121
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #1 kdy: 04. 09. 2019, 13:31:24 »
Mno... Myslím si, že nejjednodušší postup v tomto případě bude vzít svůj oblíbený skryptovací jazyk (Python, bash, AWK, Perl,...) a napsat s to v něm. Jedná se o natolik specifické zadání, že nějakou vhodnou utilitu nenajdeš.

Nástřel v Bashi: sloučit všechno do jednoho souboru (cat), pomocí tr ořezat diakritiku, setřídit (sort) a odstranit duplicity (uniq). Nevýhody: odreže komentáře, nevyřeší podobnost řádků; výhody: primitivní jednoduchost a rozumná škálovatelnost.

--mhepp

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #2 kdy: 04. 09. 2019, 14:32:46 »
taky myslim, ze by to chtelo neco napsat vlastniho.

muj navrh na algoritmus:
1. v kazdem souboru spocitat pro kazdy radek nasledujici charakteristiky: pocet znaku, pocet slov, pocet znaku v jednotlivych slovech.
2. jeden ze souboru bych vzal za hlavni (H) a do nej bych postupne pridaval radky z ostatnich souboru.
ke kazdemu radku v  (H) by prilozil radek z vedlejsich souboru se stejnou delkou, poctem slov....
3. spocitat v (H) souboru levensteinovy vzdalenosti hlavniho radku a radku pod nim a podle toho to jeste presneji
seradit.
4. odmazat uplne stejne kopie radku.
5. vsechny radky natahat v programu do pameti a pak uz pracovat jen nad datovymi strukturami v pameti.
« Poslední změna: 04. 09. 2019, 14:34:17 od alex6bbc »

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #3 kdy: 04. 09. 2019, 18:31:03 »
Natahal bych to třeba do DB4, kde klíčem bude záznam s ořezanou diakritikou, případně jeho SHA-1. Hodnotou bude původní záznam i s komentářem. Tím se vyloučí duplicity. Pak už jen vyexportovat hodnoty.

Úplně stejně se to dá udělat pomocí asociativních polí v awk, Perlu, Pythonu, PHP, ...

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #4 kdy: 04. 09. 2019, 18:35:18 »
Natahal bych to třeba do DB4, kde klíčem bude záznam s ořezanou diakritikou, případně jeho SHA-1. Hodnotou bude původní záznam i s komentářem. Tím se vyloučí duplicity. Pak už jen vyexportovat hodnoty.

Úplně stejně se to dá udělat pomocí asociativních polí v awk, Perlu, Pythonu, PHP, ...

hash funkce je dobra na duplicity, ale na male rozdily v diakritice, pismenku navic apod. jsou lepsi funkce pro vzdalenost mezi stringy (string metric, string distance function).


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #5 kdy: 04. 09. 2019, 19:17:10 »
Natahal bych to třeba do DB4, kde klíčem bude záznam s ořezanou diakritikou, případně jeho SHA-1. Hodnotou bude původní záznam i s komentářem. Tím se vyloučí duplicity. Pak už jen vyexportovat hodnoty.

Úplně stejně se to dá udělat pomocí asociativních polí v awk, Perlu, Pythonu, PHP, ...

hash funkce je dobra na duplicity, ale na male rozdily v diakritice, pismenku navic apod. jsou lepsi funkce pro vzdalenost mezi stringy (string metric, string distance function).

Bylo myšleno, že se nejprve ořízne diakritika a interpunkce. Ke klíči je možné přidat další atributy, pokud jsou potřebné. Teprve pak se aplikuje hash. Tuto techniku používám, protože se mi osvědčila.

alex6bbc

  • *****
  • 1 431
    • Zobrazit profil
    • E-mail
Re:Porovnání a sjednocení 5 souborů=->1, diff, podobnost, duplicity
« Odpověď #6 kdy: 05. 09. 2019, 06:16:39 »
Natahal bych to třeba do DB4, kde klíčem bude záznam s ořezanou diakritikou, případně jeho SHA-1. Hodnotou bude původní záznam i s komentářem. Tím se vyloučí duplicity. Pak už jen vyexportovat hodnoty.

Úplně stejně se to dá udělat pomocí asociativních polí v awk, Perlu, Pythonu, PHP, ...

hash funkce je dobra na duplicity, ale na male rozdily v diakritice, pismenku navic apod. jsou lepsi funkce pro vzdalenost mezi stringy (string metric, string distance function).

Bylo myšleno, že se nejprve ořízne diakritika a interpunkce. Ke klíči je možné přidat další atributy, pokud jsou potřebné. Teprve pak se aplikuje hash. Tuto techniku používám, protože se mi osvědčila.

jasnacka