You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
24 KiB
126 lines
24 KiB
4 years ago
|
"""
|
||
|
sphinx.search.fi
|
||
|
~~~~~~~~~~~~~~~~
|
||
|
|
||
|
Finnish search language: includes the JS Finnish stemmer.
|
||
|
|
||
|
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
|
||
|
:license: BSD, see LICENSE for details.
|
||
|
"""
|
||
|
|
||
|
from typing import Dict
|
||
|
|
||
|
import snowballstemmer
|
||
|
|
||
|
from sphinx.search import SearchLanguage, parse_stop_word
|
||
|
|
||
|
finnish_stopwords = parse_stop_word('''
|
||
|
| source: http://snowball.tartarus.org/algorithms/finnish/stop.txt
|
||
|
| forms of BE
|
||
|
|
||
|
olla
|
||
|
olen
|
||
|
olet
|
||
|
on
|
||
|
olemme
|
||
|
olette
|
||
|
ovat
|
||
|
ole | negative form
|
||
|
|
||
|
oli
|
||
|
olisi
|
||
|
olisit
|
||
|
olisin
|
||
|
olisimme
|
||
|
olisitte
|
||
|
olisivat
|
||
|
olit
|
||
|
olin
|
||
|
olimme
|
||
|
olitte
|
||
|
olivat
|
||
|
ollut
|
||
|
olleet
|
||
|
|
||
|
en | negation
|
||
|
et
|
||
|
ei
|
||
|
emme
|
||
|
ette
|
||
|
eivät
|
||
|
|
||
|
|Nom Gen Acc Part Iness Elat Illat Adess Ablat Allat Ess Trans
|
||
|
minä minun minut minua minussa minusta minuun minulla minulta minulle | I
|
||
|
sinä sinun sinut sinua sinussa sinusta sinuun sinulla sinulta sinulle | you
|
||
|
hän hänen hänet häntä hänessä hänestä häneen hänellä häneltä hänelle | he she
|
||
|
me meidän meidät meitä meissä meistä meihin meillä meiltä meille | we
|
||
|
te teidän teidät teitä teissä teistä teihin teillä teiltä teille | you
|
||
|
he heidän heidät heitä heissä heistä heihin heillä heiltä heille | they
|
||
|
|
||
|
tämä tämän tätä tässä tästä tähän tällä tältä tälle tänä täksi | this
|
||
|
tuo tuon tuota tuossa tuosta tuohon tuolla tuolta tuolle tuona tuoksi | that
|
||
|
se sen sitä siinä siitä siihen sillä siltä sille sinä siksi | it
|
||
|
nämä näiden näitä näissä näistä näihin näillä näiltä näille näinä näiksi | these
|
||
|
nuo noiden noita noissa noista noihin noilla noilta noille noina noiksi | those
|
||
|
ne niiden niitä niissä niistä niihin niillä niiltä niille niinä niiksi | they
|
||
|
|
||
|
kuka kenen kenet ketä kenessä kenestä keneen kenellä keneltä kenelle kenenä keneksi| who
|
||
|
ketkä keiden ketkä keitä keissä keistä keihin keillä keiltä keille keinä keiksi | (pl)
|
||
|
mikä minkä minkä mitä missä mistä mihin millä miltä mille minä miksi | which what
|
||
|
mitkä | (pl)
|
||
|
|
||
|
joka jonka jota jossa josta johon jolla jolta jolle jona joksi | who which
|
||
|
jotka joiden joita joissa joista joihin joilla joilta joille joina joiksi | (pl)
|
||
|
|
||
|
| conjunctions
|
||
|
|
||
|
että | that
|
||
|
ja | and
|
||
|
jos | if
|
||
|
koska | because
|
||
|
kuin | than
|
||
|
mutta | but
|
||
|
niin | so
|
||
|
sekä | and
|
||
|
sillä | for
|
||
|
tai | or
|
||
|
vaan | but
|
||
|
vai | or
|
||
|
vaikka | although
|
||
|
|
||
|
|
||
|
| prepositions
|
||
|
|
||
|
kanssa | with
|
||
|
mukaan | according to
|
||
|
noin | about
|
||
|
poikki | across
|
||
|
yli | over, across
|
||
|
|
||
|
| other
|
||
|
|
||
|
kun | when
|
||
|
niin | so
|
||
|
nyt | now
|
||
|
itse | self
|
||
|
''')
|
||
|
|
||
|
js_stemmer = """
|
||
|
var JSX={};(function(j){function l(b,e){var a=function(){};a.prototype=e.prototype;var c=new a;for(var d in b){b[d].prototype=c}}function M(c,b){for(var a in b.prototype)if(b.prototype.hasOwnProperty(a))c.prototype[a]=b.prototype[a]}function f(a,b,d){function c(a,b,c){delete a[b];a[b]=c;return c}Object.defineProperty(a,b,{get:function(){return c(a,b,d())},set:function(d){c(a,b,d)},enumerable:true,configurable:true})}function N(a,b,c){return a[b]=a[b]/c|0}var s=parseInt;var C=parseFloat;function O(a){return a!==a}var A=isFinite;var z=encodeURIComponent;var y=decodeURIComponent;var x=encodeURI;var v=decodeURI;var u=Object.prototype.toString;var E=Object.prototype.hasOwnProperty;function k(){}j.require=function(b){var a=q[b];return a!==undefined?a:null};j.profilerIsRunning=function(){return k.getResults!=null};j.getProfileResults=function(){return(k.getResults||function(){return{}})()};j.postProfileResults=function(a,b){if(k.postResults==null)throw new Error('profiler has not been turned on');return k.postResults(a,b)};j.resetProfileResults=function(){if(k.resetResults==null)throw new Error('profiler has not been turned on');return k.resetResults()};j.DEBUG=false;function t(){};l([t],Error);function b(a,b,c){this.F=a.length;this.M=a;this.N=b;this.H=c;this.G=null;this.S=null};function m(a,b,c,d,e){this.F=a.length;this.M=a;this.N=b;this.H=c;this.G=d;this.S=e};l([b,m],Object);function p(){};l([p],Object);function g(){var a;var b;var c;this.I={};a=this.E='';b=this._=0;c=this.A=a.length;this.B=0;this.C=b;this.D=c};l([g],p);function w(a,b){a.E=b.E;a._=b._;a.A=b.A;a.B=b.B;a.C=b.C;a.D=b.D};function n(b,d,c,e){var a;if(b._>=b.A){return false}a=b.E.charCodeAt(b._);if(a>e||a<c){return false}a-=c;if((d[a>>>3]&1<<(a&7))===0){return false}b._++;return true};g.prototype.L=function(c,b,d){var a;if(this._<=this.B){return false}a=this.E.charCodeAt(this._-1);if(a>d||a<b){return false}a-=b;if((c[a>>>3]&1<<(a&7))===0){return false}this._--;return true};function h(b,d,c,e){var a;if(b._<=b.B){return false}a=b.E.charCodeAt(b._-1);if(a>e||a<c){return false}a-=c;if((d[a>>>3]&1<<(a&7))===0){return false}b._--;return true};function o(a,d,c,e){var b;if(a._>=a.A){return false}b=a.E.charCodeAt(a._);if(b>e||b<c){a._++;return true}b-=c;if((d[b>>>3]&1<<(b&7))===0){a._++;return true}return false};function i(a,d,c,e){var b;if(a._<=a.B){return false}b=a.E.charCodeAt(a._-1);if(b>e||b<c){a._--;return true}b-=c;if((d[b>>>3]&1<<(b&7))===0){a._--;return true}return false};g.prototype.K=function(a,c){var b;if(this._-this.B<a){return false}if(this.E.slice((b=this._)-a,b)!==c){return false}this._-=a;return true};function c(a,b,d){var c;if(a._-a.B<b){return false}if(a.E.slice((c=a._)-b,c)!==d){return false}a._-=b;return true};g.prototype.Q=function(l,o){var b;var d;var e;var m;var f;var j;var k;var h;var g;var c;var a;var i;var n;b=0;d=o;e=this._;m=this.B;f=0;j=0;k=false;while(true){h=b+(d-b>>1);g=0;c=f<j?f:j;a=l[h];for(i=a.F-1-c;i>=0;i--){if(e-c===m){g=-1;break}g=this.E.charCodeAt(e-1-c)-a.M.charCodeAt(i);if(g!==0){break}c++}if(g<0){d=h;j=c}else{b=h;f=c}if(d-b<=1){if(b>0){break}if(d===b){break}if(k){break}k=true}}while(true){a=l[b];if(f>=a.F){this._=e-a.F|0;if(a.G==null){return a.H}n=a.G(this);this._=e-a.F|0;if(n){return a.H}}b=a.N;if(b<0){return 0}}return-1};function e(d,m,p){var b;var g;var e;var n;var f;var k;var l;var i;var h;var c;var a;var j;var o;b=0;g=p;e=d._;n=d.B;f=0;k=0;l=false;while(true){i=b+(g-b>>1);h=0;c=f<k?f:k;a=m[i];for(j=a.F-1-c;j>=0;j--){if(e-c===n){h=-1;break}h=d.E.charCodeAt(e-1-c)-a.M.charCodeAt(j);if(h!==0){break}c++}if(h<0){g=i;k=c}else{b=i;f=c}if(g-b<=1){if(b>0){break}if(g===b){break}if(l){break}l=true}}while(true){a=m[b];if(f>=a.F){d._=e-a.F|0;if(a.G==null){return a.H}o=a.G(d);d._=e-a.F|0;if(o){return a.H}}b=a.N;if(b<0){return 0}}return-1};function D(a,b,d,e){var c;c=e.length-(d-b);a.E=a.E.slice(0,b)+e+a.E.slice(d);a.A+=c|0;if(a._>=d){a._+=c|0}else if(a._>b){a._=b}return c|0};function d(a,f){var b;var c;var d;var e;b=false;if((c=a.C)<0||c>(d=a.D)||d>(e=a.A)||e>a.E.length?false:true){D(a,a.C,a.D,f);b=true}return b};function r(a,f){var b;var
|
||
|
var Stemmer = JSX.require("src/finnish-stemmer.jsx").FinnishStemmer;
|
||
|
"""
|
||
|
|
||
|
|
||
|
class SearchFinnish(SearchLanguage):
|
||
|
lang = 'fi'
|
||
|
language_name = 'Finnish'
|
||
|
js_stemmer_rawcode = 'finnish-stemmer.js'
|
||
|
js_stemmer_code = js_stemmer
|
||
|
stopwords = finnish_stopwords
|
||
|
|
||
|
def init(self, options: Dict) -> None:
|
||
|
self.stemmer = snowballstemmer.stemmer('finnish')
|
||
|
|
||
|
def stem(self, word: str) -> str:
|
||
|
return self.stemmer.stemWord(word.lower())
|