logo
28.08.2019 22:25
1
Zdravím a potřeboval bych poradit s menším zádrhelem:

Mám pole, které obsahuje podobné texty. Např.

Kód:
Hadice tlaková
Hadice tlaková 1/2
Tlaková hadice 566789
Tlaková hadice 577898
Tlaková silná hadice 45677
atd ...

Nebo:
Kód:
Elektrolytický kondenzátor nippon 47uF 100V
Elektrolitycký kondenzátor nippon 1000uF 35V
Elektrolitycký kondenzátor nippon 9767898 4700uF/25V
Elektrolitycký kondenzátor nippon 567788
5667 1000uF 25V Elektrolitycký kondenzátor nippon 
220uF50V Elektrolitycký kondenzátor nippon
atd ....

a chtěl bych z toho dostat frázi, která je společná všem prvkům. V tomto případě by to byla fráze " tlaková hadice" a "elektrolitycký kondenzátor nippon" tuto frázi ale předem neznám. A nevím ani jak bude dlouhá. Jak by jste na to šli?
Díky za nakopnutí.
28.08.2019 23:03
2
Každou větu rozdělit na slova podle mezer, slova vložit do pole a udělat si ještě na každém slovu příznak "obsahuje". Projet všechny věty navzájem a nastavit příznak (non case sensitive porovnání). Ze slov s příznakem "obsahuje" udělat frázi.
28.08.2019 23:59
3
prebehni si vsetky retazce cez transliteraciu do asci, idealne bez interpunkcie.
sprav foreach pre kazdy zaznam, splitni to na medzerach a ziskaj pre kazde slovo zaciatocnu a konecnu poziciu v stirngu. cize ak mas "abcd efgh jklmn" tak pre abcd to bude 0,3, pre efgh to bude 5,8 a td. potom si sprav zase slucku pre kazdy zaznam a ignoruj ten akitvny, samozrejme.
nasledne pre kazde slovo ktore mas zacni kontorlovat ci retazec obsahuje to slovo, ak ano tak zacni pridavat k tym poziciam -1 a +1, podla toho vytiahni susedny znak z originalneho retazca a znovu porovnaj az kym sa nezaseknes na oboch stranach alebo nenarazis na zaciatok alebo koniec aktivneho stringu. niekam si zapis zhodny retazec, jeho dlzku a deltu/index zaznamu ktory ho obsahoval.
na koniec si usporiadaj najdene zhody podla dlzky a podla poctu zhod, to uz je na tebe ktore prioritizujes.

ak nie je jasne co pisem tak nevadi lebo je pol noc a nechce sa mi to inak rozpisovat.
29.08.2019 07:47
4
řada běžných algoritmů pro texty je popsaná na http://www.512.cz/index.php?title=Al..._použit%C3%AD

Pro tebe je asi nejjednodušší si dát řetězce do pole, seřadit je podle abecedy, vzít první a poslední rětězec, poslední projít po písmenech a zastavit se až písmena přestanou být shodná s těmi na stejné pozici u prvního řetězce v seřazeném poli.

Porovnávat musíš bez ohledu na velikosti písmen. Pokud chceš sadu rětězců sdružit podle jejich společných prefixů, algoritmus by byl složitější, musel bys si pamatovat nejdelší prefix, posunout se na další slovo a poté sdružit slova. Už by se jednalo o NP-problém a složitost by šla exponenciálně nahoru.
29.08.2019 15:15
5
Takže díky všem, snad vyřešeno, koho by to zajímalo tak asi takto:

použil jsem nakonec sphinx + sphinx api pro php, ten mi tam už běžel (index aby se nepřetěžovala db, něco jako elasticsearch) a pak nad výsledkem funkci similar_text https://www.php.net/manual/en/function.similar-text.php

pak pár foreachů a ještě dynamické nastavení po kolika slovech to probublává podle velikosti výsledku.

Překvapivě to je docela rychlé, teď ještě testuji omezení různých znaků a nastavení vah....