A Porter-szótövező
Az algoritmus részletes bemutatásához szükség van néhány definícióra (Porter,
1980). Mássalhangzó minden olyan betű, amely nem A, E, I, O, U, illetve mássalhangzó
utáni Y (ebben a részben a szóalakokat, illetve azok részeit nagybetűvel írjuk). A toy
szóban a T és az Y is mássalhangzó, a syzygy-ben S, Z és G a mássalhangzó. Ha egy
betű nem mássalhangzó, akkor magánhangzó. A mássalhangzókat -vel (consonant), a
magánhangzókat
-vel (vowel) jelöljük. A mássalhangzók, illetve magánhangzók nem
üres sorozatát rendre
, illetve
jelöli, azaz reguláris kifejezéssel
, és
. Evvel a jelölésmóddal minden szó az alábbi négy alak egyikét veheti
fel:
illetve ha -szel jelöljük az
opcionális előfordulását, akkor ez egyszerűsíthető
a
alakokra, ahol a második kifejezésben az kitevő a
sorozat ismétlődésének
számát jelzi.
Nézzünk néhány példát különböző értékeire:
![]() | be, a, free |
![]() | this, trouble, eat |
![]() | lines, capote, eaten |
Ahogy azt a könyvben is megadtuk, az átírószabályok alakja
A feltétel az -től megfosztott szótő
értékére vonatkozó feltételen kívül az
alábbi típusú megszorításokat tartalmazhatja:
A feltétel logikai operátorokat is tartalmazhat.
Az algoritmus öt fő lépésből áll. Az egyes lépéseken belül, ha egy szóalak több átírószabályra is illeszkedik, akkor az kerül végrehajtásra, amelyik a leghosszabban illeszkedik a szóalakra.
Az első lépés több részlépésből áll, amelyek a többes szám és a melléknévi igenevek jelének a levágását végzik. Az 1a. lépésben a többes szám jelének feldolgozása és újrakódolása történik. Az 1b. lépésben a múlt (-D) és jelen idejű melléknévi igenév (-ING) képzője kerül lemetszésre.
1a. lépés | ||
1. | SSES ![]() | caresses ![]() |
2. | IES ![]() | ponies ![]() ![]() |
3. | SS ![]() | caress ![]() |
4. | S ![]() | cats ![]() |
1b. lépés | ||
5. | ![]() ![]() | feed ![]() ![]() |
6. | (*v*) ED ![]() | plastered ![]() ![]() |
7. | (*v*) ING ![]() | motoring ![]() ![]() |
A következő lépést akkor kell végrehajtani, ha a 6. vagy a 7. szabályt sikeresen alkalmaztuk. Ezek a szabályok az 1b. lépés után megmaradt szóalakvégek újrakódolását végzik el, amire azért van szükség, hogy a későbbi szabályokat uniform módon alkalmazhassuk. Végül az 1. lépés utolsó eleme (1c) a szóvégi Y-t írja át I-re, ha van a szóalakban másik magánhangzó.
1b’. lépés | ||
8. | AT ![]() | conflat(ed) ![]() |
9. | BL ![]() | troubl(ed) ![]() |
10. | IZ ![]() | siz(ed) ![]() |
11. | ![]() | hopp(ing) ![]() ![]() ![]() ![]() ![]() |
12. | ![]() ![]() | fail(ing) ![]() ![]() |
1c. lépés | ||
13. | ![]() ![]() ![]() | happy ![]() ![]() |
A 2. lépés a dupla képzők második tagját vágja le. Az utolsó előtti karakter indexelése alapján a lépés hatékonyan megvalósítható. Hasonló indexelő technika alkalmazható a következő lépések során is (ld. még a könyv 2.2. ábráját).
2. lépés | ||
14. | ![]() ![]() | relational ![]() |
15. | ![]() ![]() | conditional ![]() ![]() |
16. | ![]() ![]() | valenci ![]() |
17. | ![]() ![]() | hesitanci ![]() |
18. | ![]() ![]() | digitizer ![]() |
19. | ![]() ![]() | conformabli ![]() |
20. | ![]() ![]() | radicalli ![]() |
21. | ![]() ![]() | differentli ![]() |
22. | ![]() ![]() | vileli ![]() |
23. | ![]() ![]() | analogousli ![]() |
24. | ![]() ![]() | vietnamization ![]() |
25. | ![]() ![]() | predication ![]() |
26. | ![]() ![]() | operator ![]() |
27. | ![]() ![]() | feudalism ![]() |
28. | ![]() ![]() | decisiveness ![]() |
29. | ![]() ![]() | hopefulness ![]() |
30. | ![]() ![]() | callousness ![]() |
31. | ![]() ![]() | formaliti ![]() |
32. | ![]() ![]() | sensitiviti ![]() |
33. | ![]() ![]() | sensibiliti ![]() |
A 3. és 4. lépésben különböző képzők levágását végzi az algoritmus. A különbség
a szóalak értékére vonatkozó feltételben és az implementálásnál alkalmazandó
karakter vizsgálatában van: a 3. lépésben az utolsó, míg a 4. lépésben az utolsó előtti
karakter szerint kell elágazni.
3. lépés | ||
34. | ![]() ![]() | triplicate ![]() |
35. | ![]() ![]() | formative ![]() |
36. | ![]() ![]() | formalize ![]() |
37. | ![]() ![]() | electriciti ![]() |
38. | ![]() ![]() | electrical ![]() |
39. | ![]() ![]() | hopeful ![]() |
40. | ![]() ![]() | goodness ![]() |
4. lépés | ||
41. | ![]() ![]() | revival ![]() |
42. | ![]() ![]() | allowance ![]() |
43. | ![]() ![]() | inference ![]() |
44. | ![]() ![]() | airliner ![]() |
45. | ![]() ![]() | gyroscopic ![]() |
46. | ![]() ![]() | adjustable ![]() |
47. | ![]() ![]() | defensible ![]() |
48. | ![]() ![]() | irritant ![]() |
49. | ![]() ![]() | replacement ![]() |
50. | ![]() ![]() | adjustment ![]() |
51. | ![]() ![]() | dependent ![]() |
52. | ![]() ![]() | adoption ![]() |
53. | ![]() ![]() | homologou ![]() |
54. | ![]() ![]() | communism ![]() |
55. | ![]() ![]() | activate ![]() |
56. | ![]() ![]() | angulariti ![]() |
57. | ![]() ![]() | homologous ![]() |
58. | ![]() ![]() | effective ![]() |
59. | ![]() ![]() | bowdlerize ![]() |
Az utolsó lépésben csak az eredmények egységesítését végzi a módszer, a szóvégi E levágásával, illetve a kettős LL rövidítésével.
5a) lépés | ||
60. | ![]() ![]() | probate ![]() ![]() |
61. | ![]() ![]() | cease ![]() |
5b) lépés | ||
62. | ![]() | controll ![]() ![]() |
PÉLDA. Nézzük meg először, hogyan működik az algoritmus a generalizations szó esetén. Az alábbiakban a nyilakon feltüntettük az alkalmazott szabályok számát.
generalizations generalization
generalize
general
gener
A következő példán az oscillators szó szótövezését követhetjük végig.
oscillators oscillator
oscillate
oscill
oscil
A Porter-szótövező egy implementációja online kipróbálható ezen a honlapon.
M. F. Porter. An algorithm for suffix stripping. Program, 14(3):130–137, 1980.
M. F. Porter. Snowball: A language for stemming algorithms, 2001.