Indexování
publikací slovníkového typu - uživatelská dokumentace
Všeobecně
Produkt je určen pro elektronické publikování na CD nebo na
Internetu.
Může být kombinován i s dalšími produkty firmy Eridanus (například
hledání v katalogu a indexování adresáře HTML dokumentů).
Publikací slovníkového charakteru
se
rozumí XML soubor vytvořený podle základního
návrhu nebo navržený uživatelem.
Zapojení produktu do aplikace musí provést programátor ovládající
jazyk 'C'.
Formát
logického výrazu v dotazu
Je popsán ve FT.htm
jako
"Query format / Full". Formát tam popsaný je základní.
Slovníkový
modul obsahuje některá jeho rozšíření:
Příznaky
vyskytující se ve slovech
-
'|' (kolmička):
-
slouží k ? (doplnit způsob použití - ve firmě Leda)
-
slouží k náhradě tagů uvnitř slov při přípravě souborů k
indexování
- prosté vypuštění tagů by změnilo offsety slov v souboru
-
0x7FA4 (Unicode 2022, bullet) - slouží k ? (doplnit způsob
použití
- ve firmě Leda)
Tyto znaky jsou při indexování ignorovány -
tj.
slovo "děl|ník" bude zaindexováno jako "dělník".
Forma
splupráce s koncovým programem
Může být různého druhu - přilinkovaná
knihovna, knihovna DLL, nebo samostatný proces (souborový
server).
Rovněž inicializační parametry mohou být
předávány rozličným způsobem - při volání knihovny, v souboru
.INI nebo v Registry (viz E_FileCm.htm).
Při chybě v programu se vrací obpověď
začínající
textem "ERROR=n..."
(před ním mohou případně být bílé znaky).
Spolupráce zde popsaná je pro souborový
server.
Parametry se uvádějí v uvozovkách pouze tam, kde je to vyznačeno
ve
schematu příkazového řádku.
-
INDEX_FILE
I=fullpath_XML,J=j,K=offsets,B=b,O=path_out,M=m,N=n,W=w,F=f,S=s,P=p,D=d,G=g,H=h,T0=tag,T1=tag,...,L0=language,L1=language,...
-
fullpath_XML
- cesta
(viděno z pozice serveru) ke vstupnímu XML souboru, musí být
uvedeno
i pokud J=Y.
Přípona souboru je
-
.xml - pro skutečný XML soubor
-
.xm2 - pro soubor dat ve formátu
záznamů:
-
offset=nnnn word="slovo"
-
offset=nnnn tag="jmeno_tagu"
type="O|C" length="nn""
kde:
-
jmeno_tagu je tag určený k
indexování - musí
být v seznamu
-
type je O pro otevírací značku, C
pro zavírací
značku
-
length je délka značky (nepoužije
se)
-
j - 'Y' pro
XML soubor
ve tvaru:
-
INDEX_FILE ... - příkazová řádka
-
XML_FILE - oddělovací řádek
-
XML soubor - většinou uživatelský
slovník
-
offsets -
cesta (viděno
z pozice serveru) k souboru ve formátu:
-
offset=nnnnnnnn word=“slovo“
-
...
Pokud je tento parametr uveden, soubor bude vyžadován, tj. musí
být
k disposici nebo být vyroben v rutině LEDA_replace_in_text().
Při vlastním indexování se řádky souboru přečtou a slova s
offsety
se vloží do indexu.
-
b - 'Y' pro
vynechání
rutiny LEDA_replace_in_text().
-
path_out -
path výstupních
souborů (tj. index + Tag-Language-Offset soubor+soubor
zvukové vrstvy+XMW
XMI soubory_slov) - pokud cesta obsahuje lomitko, bere se
jako úplná,
jinak se úplná cesta se získá kombinací
glo_working_directory + tento
stem. K úplné cestě se potom přidává příslušná přípona
souboru
-
m -
'Y' pro výrobu zvukové vrstvy nebo 'N' pro opak; default is
'N'
-
w - 'Y' pro
nevymazání
souboru se seznamem indexovaných slov. Tento soubor má
koncovku .XMW.
-
n - 'Y'
nebo 'E' pro
výrobu souborů s přehledem indexovaných slov (včetně
frekvence a
vzoru) nebo 'N' pro opak; default je 'N'. Pro správnou
výrobu je třeba
v indexovaném souboru uvádět správné kódy jazyků; jinak se
použije
"EN". Vstupem je soubor .XMW - viz výše; výstupem jsou dva
soubory se
stejnou informační hodnotou:
-
.XMX - je tříděn podle abecedy
-
.XMY - je tříděn podle četnosti
Obsah souborů je zřejmý vyjma:
-
slova nenalezená v morfologii mají !
na počátku
řádky - aby byla uvedena je třeba zadat F=Y - viz níže
-
posledního údaje, kterým je styl. V
současnosti
je styl roven1.
-
tags=HH... - k dekódování je třeba
použít seznam
tagů z příkazové řádky, která výrobu souborů zadala
Hodnota 'E' značí výrobu těchto souborů
bez výroby indexu.
-
f - 'Y' pro
uvedení
všech slov v souborech .XMX a .XMY, 'N' způsobí
uvedení jen slov nalezených v tvarosloví; default je 'Y'
-
s - 'Y' pro
indexovaní
slov pouze uvnitř vybraných tagů nebo 'N' pro opak; default
is 'N';
s tímto parametrem nastaveným na 'Y' se buduje plnohodnotný
soubor .TLO,
zatímco při tagu T1=*
obsahuje soubor .TLO pouze tagy entry.
-
p - typ
zpracování
oddělovačů:
-
'L' - standardní oddělovače mimo
tečky, tečka
je vyznačena tagem <punc>; default - hodí se
pro soubory se
zkratkami
-
'S' - standardní oddělovače včetně
tečky, tj.
nepředpokládají se tagy <punc> v XML textu
-
'X' - všechny oddělovače jsou
vyznačené tagem
<punc>
-
d
- 'Y' pro výrobu adresáře slov
-
g
- 'Y' pro výrobu prostého seznamu slov
-
h - 'Y' pro
ignorování
jazykových údajů v XML - tak se dá zpracovat i soubor s
vadným hnízděním
tagů
-
tag - tag
vybraný pro
Tag-Language-Offset soubor - tag se porovnává jako
memcmp(tag, tag_found,
strlen(tag)); T0 musí být "<entry " nebo "<entry>";
maximální
počet tagů a jejich maximální délka je dána konstantami
v DB_BASE.h:
-
#define TAG_LANG_OFFSET_MAX_COUNT 30
-
#define
TAG_LANG_OFFSET_MAX_SIZE
64
Tag T1
můze být *
- potom se indexují všechny tagy - viz také parametr s
výše.
Pokud některý tag obsahuje mezery, měl by
být (pro zdůraznění tohoto faktu) uzavřežen do uvozovek.
-
language -
jazyk pro
Tag-Language-Offset soubor; dvojpísmenová zkratka podle ISO
639 ("CS",
"DE", "EN", ...) - počet jazyků slouží ke stanovení počtu
jazykových
bitů rezervovaných v Tag-Language-Offset souboru; maximální
počet
jazyků je dán konstantou v DB_BASE.h:
#define TAG_LANG_OFFSET_MAX_COUNT 20
Při indexování se nastavují příznaky
GET_WORD_PURGE_SORROUNDING_QUOTES
| GET_WORD_DO_NOT_CRASH_ON_AMPS |
GET_WORD_MULTIGENERATE_FOR_HYPHENS
| GET_WORD_MULTIGENERATE_FOR_DATUMS |
GET_WORD_MULTIGENERATE_FOR_NUMBERS
- zatím jsou napevno, v budoucnosti by mohly být ovládány
nějakým
parametrem.
Indexování uživatelského slovníku se bude
dělat stejně.
Program při indexování vynechává slova
dlouhá
64 a více bytů. Zprávu o počtu takto vynechaných slov a také o
počtu
slov sestávajících z binární nuly vrací v chybovém hlášení.
Pokud se indexují tagy pro výslovnost, <pron>
nebo <pronun>, do zvukové vrstvy se ukládají s
fonetickými
znaky nahrazenými podobnými velkými písmeny.
Program při indexování vynechává hesla
(<entry
...> ... </entry>) obsahujici v tagu entry slova
valid=N
nebo
index=N
ohraničená znaky " ,>".
Soubor odpovědi:
SUCCESS
END
nebo
sprintf(stext, "ERROR=%ld\r\n
MASK_ERROR=%ld\r\n
ERROR_TEXT=%s\r\n ERROR_POSITION=%ld\r\n
too_long_words_count=%ld\r\n
number_of_zero_words=%ld\r\n\r\n", ret_val, mask_error,
error_word, error_position,
too_long_words_count, number_of_zero_words);
DB_WriteFileStringValue(glo_handle_out,
stext);
if (
ERROR_INFO_GetForDisplay("ERROR_INFO:\r\n",
" ", stext, BUFSIZE_4K) != 0 )
DB_WriteFileStringValue(glo_handle_out,
stext);
DB_WriteFileStringValue(glo_handle_out,
"END\r\n");
Přehled souborů po indexaci:
.XXD - seznam souborů v .XXI
souboru
.XXI - indexový soubor
.TLO - TagLanguageOffset
soubor -
vyrábí se vždy
.DSD - zvuková vrstva - vyrábí
se na požádání - viz parametry příkazu INDEX_FILE
.XMW - vyrábí se na
požádání
- viz parametry příkazu INDEX_FILE
.XMI -
vyrábí
se na požádání - viz parametry příkazu INDEX_FILE
.DIR
-
vyrábí se na požádání - viz parametr d příkazu INDEX_FILE
.XMA
-
vyrábí se na požádání - viz parametr g příkazu INDEX_FILE
Poznámka: Slovní soubory by se měly
sloučit dohromady, měl by tam být i údaj o frekvenci
-
FIND_IN_DB
T="slovo",CP=code_page,L=language
-
slovo - slovo pro hledání v Databázi
-
code_page - slovo příchází zakódováno v
této
kódové stránce
-
language - omezí hledání na tento jazyk
Soubor odpovědi:
FOUND_IN_DB:
T="slovo",O=object,B=basic_name,L=language,S=stem,P=pattern,G=logic_pattern,F=first_shape,C=current_shape
... - podají
se
všechny výskyty včetně těch, které se liší pouze v G (například
1.pád a 4.pád)
END
-
FIND_IN_FILE
I=fullpath_XML,O=path_out,T="text",CP=code_page,L=language,M=maska,P=param_bits,C=max_count,D=distance_for_near,
Sm=min_word_out_display_size,
SM=max_word_out_display_size,Sx=check_exact_last_letter,H=return_hits,G=return_grammar_info,W=return_words,
J=sort_by_order,DC=decode_string_key
-
fullpath_XML - jako
v INDEX_FILE;
nemusí být uvedeno - potom se bere jméno souboru uložené v
indexu
-
path_out - jako
v INDEX_FILE
-
text - logický
výraz
- viz popis logického výrazu
(včetně rozšíření
pro firmu Leda) a také param_bits níže
-
code_page - text příchází
zakódován v této kódové stránce
-
language - dvoupísmenová
zkratka
podle ISO 639 (český jazyk je "CS", němčina je "DE", atd.)
- pro hledání ve všech jazycích se parametr vynechá;
je možno zadat i seznam jazyků, v tom
případě
se jazyky oddělí čárkami a vloží do uvozovek; max. počet
jazyku
je 10
-
maska - pro
výber z
tagů: max. 31 cifer 0 nebo 1 (na pozici 0 předpokládá T0 a
tak dále
- viz příkaz INDEX_FILE výše)
-
param_bits - cifry 0
nebo 1; je navrženo tak, aby nulové hodnoty odpovídaly
nejjednoduššímu
zadání:
-
0: 1 => jen přesný tvar
-
1: 1 => přes zvukovou
vrstvu (zatím
se nezpracovává - viz popis způsobů hledání)
-
2: 1 => bez ohledu na
diakritiku (tj.
zpracovat všechny možné kombinace) - Leda nepoužívá: je
pomalé pro
dlouhá slova
-
3: 1 => dodržet
Velké-malé písmeno
(case sensitive) - toto nastavení platí pro slova, kde
údaj "case sensitive"
není přímo uveden
-
4: 1 => hledání s
překlepem - Leda
nepoužívá: nestačí 32KB, přidávání písmenek, udělat i
záměny
písmen
-
5: 1 => interpretovat
znaky '?' a '*'
jako zástupné
-
6: 1 => operátor
"blízko u" bude vyhodnocen
volajícím programem
-
7: 1 => operátor
"blízko u" bude vyhodnocen
speciální rutinou pro LEDA (zpracuje tagy uvnitř slov)
-
8: 1 => na výstup
půjdou i výskyty
s nesplněným operátorem "blízko u" (to je dobré pro ladění
a někdy
i pro použití)
-
9: 1 => text smí
obsahovat operátory
NOT, AND, OR (vedle standardních ~, ||, &&);
program doplní uvozovky
kolem slov
-
10: 1 => text smí obsahovat
operátory NE, A, NEBO
(vedle standardních ~, ||, &&); program doplní
uvozovky kolem
slov
-
11: 1 => chybějící
operátory
jsou považovány za &&; program doplní uvozovky
kolem
slov
-
12: 1 => všechny && (i
nahrazené nebo doplněné)
se mají považovat za @@
-
13: 1 => hledání se neomezuje na
rámec jednoho
tagu, provádí se v rámci celého <entry...> ...
</entry>
-
14: 1 => operátor "blízko
u"
se bude řídit vzdáleností ve znacích a ne ve slovech - tím
se
odstraní nutnost jít do XML souborů
-
15: 1 => v textu dotazu se ignorují
oddělovače
uvedené v LEDA_replace_separators() - mimo "()!?*"
-
16: 1 => XML soubor je kódovaný
soubor LEDA
-
17: 1 => hledání netestuje soubor
.TLO
Pro omezení rozsahu hledání je dotaz
omezen:
-
nesmí se kombinovat param_bits[4]
a
param_bits[2](viz
níže)
-
nesmí se kombinovat param_bits[4]
a
víceslovný dotaz nebo formmule
-
max_count - max.
počet výskytů na výstupu, default je 100, povolené maximum
je 30 000.
Hodnota pouze přibližně stanovuje tento počet - zda došlo k
omezení
počtu navracených výskytů, lze zjistit rozborem souboru
odpovědi. Podrobný popis lze nalézt v rutině
SERVER_FindInFile1().
-
distance_for_near - pro
operátor @@ ("blízko u") - viz param_bits[14]
-
min_word_ending_length - pro
slovo dotazu končící na '*'
-
max_word_ending_length - pro
slovo dotazu končící na '*'
-
check_exact_last_letter - pro
slovo dotazu končící na '*' - 'Y' or 'N' - 'N' podá na
"dříve" i
"dřívější"
-
return_hits - Y (default)
returns records I=index_slova,...
(see
below), N does not
-
return_grammar_info - Y
(default) returns grammar info for X="slovo_podané_z_indexu"
(see
below), N does not
-
return_words - Y (default)
returns words for X="slovo_podané_z_indexu"
(see
below), N does not
-
sort_by_order - Y (default)
returns hits sorted by order - otherwise they are sorted by
weight
-
decode_string_key -
důkladné kódování Leda
Soubor odpovědi:
FOUND_IN_FILE:
F=file_name
W="slovo_v_dotazu" -
všechna slova v dotazu
...
X="slovo_podané_z_indexu" -
všechna různá slova podaná z indexu ještě před vyhodnocením
podmínky;
pokud je G=Y, podá se také informace podávaná v dotazu "FOUND_IN_DB:"
(viz výše)
...
descriptors_found_count_total=value -
obsahuje prostý součet všech nálezů v indexu (tedy pro
víceslovné
dotazy se nálezy sčítají pro každé slovo) - tato hodnota je
užitečná
hlavně pro jednoslovné dotazy s výběrem tagů - při nalezení 0
výskytů
uživatel může být informován, že při volbě všech tagů (nebo
při
jiné volbě tagů) se něco najde.
I=index_slova,L=delka_slova,D=disjunction_weight,E=entry_offset,O=word_offset,M=maska,V=platnost,S=tag_length,T=tag_offset
... (podají
se
všechna slova víceslovného dotazu pro všechny výskyty)
-
index_slova - pořadí slova v dotazu
-
delka_slova - délka nalezeneho slova v B
- nepočítají
se do toho znaky '|'
-
disjunction_weight - násobnost splnění
disjunkcí
(0: jednonásobné, 1: dvojnásobné, ...)
-
entry_offset
-
word_offset
-
maska - max. 31 cifer 0 nebo
úroveň vnoření
tagu (na pozici 0 předpokládá T0 a tak dále). Tag
<entry> má úroveň
1, další má úroveň 2, atd.
-
platnost - distance_for_near: Y -
splněno, N - opak
-
tag_length - může sloužit pro (ne zcela
přesné)
posouzení, zda je slovo uvnitř tagu samo nebo ne
-
tag_offset - doplněk položky tag_length
pro přesný
rozbor tagu
ERROR=... -
případné
chyby:
-
too_many_hits_occurred
- chyba nalezená při hledání v indexu
-
hit_array_not_big_enough
- chyba nalezená při vyhodnocování nálezů - souvisí s
parametrem
max_count
-
číslo - číslo chyby, popis lze najít v
číselníku
chyb
END
-
FIND_IN_SOUND_LAYER
O=path_out,T="slovo",CP=code_page,L=language,P=param_bits
-
path_out - jako
v INDEX_FILE
-
slovo
-
code_page - slovo přichází
zakódováno v této kódové stránce
-
language - dvoupísmenová
zkratka
podle ISO 639 (český jazyk je "CS") - není-li uveden, vrátí
se slova ve všech jazycích
-
param_bits - cifry 0
nebo 1; je navrženo tak, aby odpovidalo FIND_IN_FILE,
tedy jsou použity následující byty:
-
0: 1 => jen podle přesného tvaru
-
4: 1 => hledání s překlepem
(hledají se variace
s překlepem, vynecháním písmene a přidáváním písmene)
Soubor odpovědi:
FOUND_IN_SOUND_LAYER:
W=slovo
D=míra_nepodobnosti,F=jazyk_nalezené_slovo
... -
následují
další nalezená slova
END
Popis:
míra_nepodobnosti -
číslo získané součtem vážených odchylek nalezeného slova od
slova
zadaného
jazyk_nalezené_slovo -
složenina: dvoupísmenová zkratka jazyka nalezeneho slova +
nalezené
slovo
-
COMPARE_AS_SOUNDS
T1="slovo1",L1=language1,CP1=code_page1,T2="slovo2",L2=language2,CP2=code_page2
-
slovo
-
language - dvoupísmenová
zkratka
podle ISO 639 (český jazyk je "CS") - není-li uveden, vrátí
se slova ve všech jazycích
-
code_page - slovo přichází
zakódováno v této kódové stránce
Soubor odpovědi:
COMPARED_AS_SOUNDS:
T1=slovo1
T2=slovo2
O1=slovo1_offset,L1=char1_length,O2=slovo2_offset,L2=char2_length,D=pokuta_za_nepodobnost
... -
následují
další znaky slov; některé offsety mohou být -1, což znamená
přeskok
přebývajícího písmena v druhém slově
CMP=součet_pokut_za_nepodobnost
END
-
FIND_IN_INDEX
O=path_out,T="slovo",CP=code_page
-
path_out - jako
v INDEX_FILE
-
slovo - slovo
smí obsahovat
libovolný počet znaků '?'
-
code_page - slovo příchází
zakódováno v této kódové stránce
Soubor odpovědi:
FOUND_IN_INDEX:
W=slovo
O=word_offset,F=nalezené_slovo
... -
následují
další nalezená slova
END
-
FIND_IN_WORDS
O=path_out,T="slovo",CP=code_page
-
path_out - jako
v INDEX_FILE
-
slovo
-
code_page - slovo přichází
zakódováno v této kódové stránce
Soubor odpovědi:
FOUND_IN_WORDS:
W=slovo
F=nalezené_slovo,
tj slovo obsahující zadané slovo jako část nebo shodné se
zadaným
slovem
... -
následují
další nalezená slova
END
-
PASSTHRU
href=url
-
url - url
tak, jak je
uvedeno v HTML textu stránky; může se uvést text "index.htm"
pro startovací
stránku
Soubor odpovědi: podá se přímo browseru - viz popis LSD-passthru
-
RESET
Ukončí probíhající operaci - server vrátí
soubor s chybou 11162
-
STOP
Ukončí běh serveru
Problémy
v souborech LEDA
Referenční místo pro všechno zpracování
typické pro LEDA je LEDA_index_file(). Uživatelské tagy
jsou definované
rutinou XML_LEDA_tags().
-
tagy uvnitř slov - jsou to:
<u> ... </u> - podtržené písmo - je
uvnitř slov - zpracuje se zvláštním procesem (přes
náhradu
znaky '|')
<dot> ... </dot> - tečka pod písmeny - je
uvnitř slov - zpracuje se zvláštním procesem - stejně
jako
<u>
-
není zásadní problém při indexování a použití v programu LEDA
(až na počítání slov pro operátor "blízko u")
-
je zásadní problém pro použití nástrojů spoléhajících na
nedělitelnost
slov - tam jsou tagy použity jako oddělovače slov neoddělených
explicitním
oddělovačem - příkladem jsou indexy ve slovnících (naproti
tomu k
indexy ve jménech chemických sloučenin jsou součástí slova
-
nevyznačené oddělovače - mělo by se vyřešit
-
další problémy jsou vidět v souborech .XMW a .XMI (výčty slov)
Popis
programu LSD-passthru
Účelem programu je výroba elektronických
publikací šířených na CD. Je to LSD s následujícími úpravami:
-
Při startu zavolá PASSTHRU
href=index.htm - tak se zobrazí
úvodní
stránka publikace.
-
Během práce programu se bude používat
pouze funkce
PASSTHRU.
-
Konec programu bude signalizován souborem
odpovědi
s textem "STOP" (dojde k tomu tak, že uživatel si na stránce
vybere
položku "Konec", příslušné url se dostane do TrTools.exe a
způsobí
zápis souboru s oním textem "STOP").
-
Bylo by vhodné z programu odebrat moduly
aktuálně
nepotřebné, ale je možné, že po dohodě s Ledou by se
slovníkové
funkce v některých aplikacích používaly.
Zpráva o využití produktu
u vybraných uživatelů
Použitelný:
-
publikace firmy LEDA,
-
elektronické publikace šířené na CD.
Seznam nalezenych chyb se
zprávou
o jejich odstranění
Seznam návrhů na
zlepšení
produktu
Popis testovacích
procedur +
testovací data
Testování v aplikacích je dostatečné.
Existuje rutina
Make_TLO_xxxx_graphically_visible()