Szavak elválasztása és tőtározó implementálása

A Microsoft számos nyelvhez biztosít szóhatárolókat és szótövezőket. Ez a leírás bemutatja, hogyan lehet implementálni és használni egyéni szóhatárolókat és szótövezőket a Microsoft által biztosítottaknál több nyelvhez és területi beállításhoz.

Jegyzet

Az egyéni szótörések ideiglenesen nem voltak támogatva. 2018 júliusában módosítás történt a Windows Server 2019-ben, amely megakadályozta, hogy a dll-ek Microsoft-aláírás nélkül töltődjenek be SearchIndexer.exe. Ezt a korlátozást 2021 januárjában feloldották.

Ez a témakör a következőképpen van rendszerezve:

Nyelvi erőforrás DLL-ének regisztrálása

Minden nyelvi erőforrás DLL-jének implementálnia és exportálnia kell a következő belépési pontokat. A DLL bármely mappában regisztrálható.

  • A DllMain a DLL-hez való szabványos belépési pont.
  • A DllRegisterServer regisztrálja a DLL-t a beállításjegyzékben, például regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
  • A DllCanUnloadNow lehetővé teszi, hogy az ügyfelek a komponensobjektum-modellen (COM) keresztül meghívják ezt a belépési pontot annak megállapításához, hogy lehetséges-e eltávolítani a nyelvi erőforrás DLL-jét.
  • A DllUnRegisterServer eltávolítja a DLL-t a beállításjegyzékből.

Nyelv regisztrálása

A beállításjegyzék nyelvspecifikus bejegyzéseket tartalmaz az indexelt nyelvhez, és ezek a bejegyzések szabályozzák az indexelési és lekérdezési folyamatok nyelvspecifikus részeit. Ezek a beállításjegyzék-bejegyzések a következő beállításkulcs alatt találhatók.

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         ContentIndex
            Control
               Language
                  

Word beaker megvalósítása

A szómegszakítók megvalósítják IWordBreaker. A IWordBreaker::BreakText metódus elvégzi az összes szövegfeldolgozást és -elemzést. A szóhatároló összetevő implementálásához nyelvi heurisztika szükséges a nyelvhez. Ez magában foglalja a szintaxissal és a morfológiával kapcsolatos információkat. Előfordulhat, hogy a kihagyandó vagy belefoglalandó szavak listájára is szüksége lehet. A kizárt szavak listájából elkészítheti a nyelvi területi beállításhoz tartozó zajszavak fájlját. A nyelvi szempontokról és arról, hogy ezek a szempontok hogyan befolyásolják a szóhatároló implementációkat, tekintse meg nyelvi és Unicode-szempontokat.

Az IWordBreaker::BreakText fő célja az, hogy folyamatosan feldolgozza a szöveget a TEXT_SOURCE, amíg az összes szöveg feldolgozásra nem kerül, vagy amíg a szótörő hibát nem észlel. Ebben az adatfeldolgozási ciklusban IWordBreaker::BreakText meghívja az elemzési és segédprogram-metódusokat, amelyek adott feladatokat hajtanak végre az adott folyamathoz. A német szóválasztó például összetett szavakat kezelhet, míg a francia szóválasztó ékezetes vagy clitics. A szóhatároló által végrehajtott konkrét függvények és a feladatok végrehajtásához használt stratégia teljes mértékben az adott nyelv követelményeitől függ.

Szövegtöréskor a szóhatárolók "alternatív" alakokat azonosítanak olyan szavak esetében, amelyek többféle megjelenéssel rendelkezhetnek. A létrehozott szavak között nincs szemantikai kapcsolat. Valójában előfordulhat, hogy az eredeti szó nem szerepel az alternatívák listájában. Az alternatív űrlapok ugyanabban a pozícióban vannak mentve az indexben, mint az eredeti szó, hogy jelezzék, hogy azonosak.

Ha egy dokumentum szerepel az indexben, minden szóhoz egy egész szám van rendelve, amely az eltolást vagy a szónak a dokumentum elejétől való távolságát jelöli. A lekérdezésben lévő szavak közötti relatív távolság a teljes szöveges indexben tárolt eltolásokkal lesz összehasonlítva. A "Where is Kyle's document" lekérdezés egyezik bármely dokumentummal, ahol a "Where" az n, az "is" az n+1, a "Kyle dokumentuma" az n+2, és a "dokumentum" az n+3 pozíción található. "Hol található Kyle dokumentuma az adatbázisban?" a következőképpen jelenik meg:

               
Hol van Kyle Kyle's
dokumentum Benyújtott ban/ben a adatbázis-adatbázis

 

Ebben a példában a szótörő alternatív formákat tárol a "Kyle" ("Kyle's") és az "adat bázis" ("data base") számára az indexben. A szóhatároló alternatív szavakat hoz létre és tárol az indexlétrehozási folyamat során az alábbi feltételek mellett:

  • Ha egy másik szó valószínűleg egyetlen szóként jelenik meg egy lekérdezésben
  • Ha egy származtató nem képes valószínűleg az eredeti szót levezetni az alternatív formából

Az alternatív szóalakok létrehozása növeli a lekérdezések által képviselt és egy mondatnak megfelelő módszerek számát, ahogy az alábbi változatokban is látható:

  1. Hol található Kyle-dokumentum az adatbázisban?
  2. Hol van Kyle dokumentuma az adatbázisban?
  3. Hol található Kyle-dokumentum az adatforrásban?
  4. Hol van Kyle dokumentuma az adatforrásban?

WordSink és PhraseSink

A szóválasztók az IWordSink és IPhraseSink objektumokkal gyűjtik össze és tárolják a szövegből kinyert összes szót és kifejezést. A szóhatárolók úgy tárolják a szavakat, hogy azok a lehető legközelebb álljanak a dokumentum eredeti szóalakjához. IPhraseSink lekérdezéskor tárolja a kifejezéseket. A kifejezések növelik a lekérdezési eredmények relevanciáját, mivel a hosszabb szósorozatok ritkábban fordulnak elő, és nagyobb különbséget tesznek a kisebb kifejezéseknél. Amikor az indexelő egy kifejezést helyez el az IPhraseSink-ben lekérdezéskor, létrehoz egy szószegmentáló példányt, amely szavakra bontja a kifejezést. Az indexelő ezután úgy értékeli ki a kifejezést, hogy ellenőrzi, hogy a kifejezésben lévő szavak egymás mellett fordulnak-e elő az indexben. Ha például az "ABCD" az indexben x, x+1, x+2 és x+3 pozícióban fordul elő, akkor a kifejezésegyezés akkor következik be, ha az "ABCD" bármely szomszédos részszúrása el lesz küldve egy lekérdezésben. Ez a stratégia olyan karakteralapú szótörések esetén hatékony, amelyek kifejezéseket és hosszú szavakat osztanak fel az index létrehozásakor, és amelyek kifejezéseket hoznak létre a lekérdezési idő alatt.

Szünetek

A szóközök a szavak közötti helyek. A szóköz, az írásjelek, a formázás vagy csak maga a nyelv természete okozhat töréseket. Az indexelő négy különböző töréstípust használ: a szó vége (EOW), a mondat vége (EOS), a bekezdés vége (EOP) és a fejezet vége (EOC). Az EOW-törés az alapértelmezett törés. Minden egyes jogkivonat után az egyes törések eltérő szemantikai távolságot jeleznek a két oldalon lévő szavak között. Az EOW által elválasztott szavak a legszorosabb szemantikai kapcsolattal rendelkeznek, amelyet az EOS, az EOP és az EOC követ. IWordSink::PutBreaktöbbhívása kumulatív, és hasonló a null szavak vagy mondatok beszúrásához.

Méretezhetőség, teljesítmény és biztonság

Az, hogy a szóelválasztó hogyan reagál az egyidejű hívásokra, nagyrészt a választott szálmodell határozza meg. Az indexelő egy egyszálas alkalmazás. Ahhoz, hogy a szóhatárolók egyszálas környezetben működjenek, a szóhatárolókat "szabad" vagy "mindkét" szálmodellel kell írni. A szóbontók nem regisztrálhatnak a COM-nál az "apartman" menetmodell használatával.

Azt javasoljuk, hogy a szóhatárolók kerüljék a globális állapotokat, és tároljanak adatokat a szóhatároló példányában. A szóhatároló implementációban csak a fQuery és ulMaxTokenSizeparamétereket kell tárolni. A szóhatárolóknak legfeljebb kétszer lassabbnak kell lenniük, mint az angol szóhatároló által meghatározott referenciaérték. A szóelválasztó teljesítményének is javulnia kell a növekvő hardverképességgel.

Az indexelő szóhatárolói a helyi rendszer biztonsági környezetében futnak. A pufferek kezelésére és helyes veremkezelésre kell megírni őket. Minden sztringmásolatnak explicit ellenőrzésekkel kell rendelkeznie a puffertúllépések elleni védelmére. Mindig ellenőrizze a puffer lefoglalt méretét, és tesztelje az adatok méretét a puffer méretével. A szóelválasztók nem vállalják azt az alapértelmezett elképzelést, hogy a IWordBreaker::BreakText metódusnak átadott szöveg helyesen formázott. A szóhatárolók hibaelhárításáról további információt Nyelvi erőforrások hibaelhárítása és ajánlott eljárásokcímű témakörben talál.

A stemmer implementálása

A stemmerek implementálják a IStemmer felületet. A IStemmer::GenerateWordForms metódus egy adott beviteli szóhoz tartozó formázott szóalakok listáját hozza létre. Egy őselem-összetevő implementálásához nyelvi heurisztika szükséges a nyelvhez. Ide tartoznak a morfológiával kapcsolatos információk. Előfordulhat, hogy a kihagyandó vagy belefoglalandó szavak listájára is szüksége lehet. További információ a nyelvi szempontokról, valamint arról, hogy ezek a szempontok hogyan befolyásolják a stemmer implementációkat, lásd nyelvi és Unicode-szempontokat.

Javasoljuk, hogy a szótőelemezők ne hozzák létre a szavak genitív, azaz birtokos esetét. A "David" például nem generálódik a "David's" alternatív alakjaként. A szótörő mind a "David", mind a "David's" kifejezéseket létrehozza, amikor a "David's"-t elemzi.

A stemmer az IWordFormSink objektummal gyűjti össze az alternatív szavak listáját. IWordFormSink::PutWord létrehozza az utolsó szót a stemmerből. Ez az utolsó szó minden esetben megegyezik a bemeneti szóval IStemmer::GenerateWordForms. Az "úszik" szóra való tekintettel például a stemmer a következő szóalakokat hozza létre: "úszás", "úszó", "úszik", "úszott" és "úszta", az IWordFormSink::PutAltWord. A származtató "úszik" szót hoz létre a IWordFormSink::PutWordsegítségével.

Méretezhetőség, teljesítmény és biztonság

A stemmereknek, mint a szóelválasztóknak, "szabad" szálkezelési modellt kell használniuk, és regisztrálniuk kell a COM-nál a szálkezelési modelljüket "szabad" vagy "mindkettő" beállítással. A Windows Search egyszerre hívja meg a stemmerek különböző szálakból származó példányait. A stemmereknek ezért minimális példányadattal kell rendelkezniük.

A stemmer pontossága jelentős hatással van a lekérdezés relevanciájára. Ha a stemmer helytelenül szótövezi a szöveget, az adatlekérdezések kiszámíthatatlan és pontatlan eredményeket adhatnak vissza. A stemmereknek másodpercenként több száz lekérdezést kell kezelnie anélkül, hogy negatívan befolyásolnák a lekérdezés teljesítményét. A stemmer teljesítményének nagyobb hardverkapacitással kell javulnia. További információ a forrásanyagok hibaelhárításáról: Nyelvi erőforrások és ajánlott eljárások hibaelhárítása.

A Windows Search stemmerjei a Helyi biztonsági környezetben futnak. A pufferek kezelésére és helyes veremkezelésre kell megírni őket. Minden sztringmásolatnak explicit ellenőrzésekkel kell rendelkeznie a puffertúllépések elleni védelmére. Mindig ellenőrizze a puffer lefoglalt méretét, és tesztelje az adatok méretét a puffer méretével.

nyelvi erőforrások kibővítése

Nyelvi erőforrás-összetevők ismertetése

nyelvi és Unicode-szempontok

Nyelvi erőforrások és ajánlott eljárások hibaelhárítása