Packages
text_stemmer
0.1.0
Pre-compiled Snowball stemmers for Elixir. Ships 36 stemming algorithms covering a wide range of natural languages, accessible through a single `Text.Stemmer.stem/2` entry point.
Current section
Files
Jump to
Current section
Files
lib/text/stemmer/stemmers/lithuanian.ex
# Generated by Snowball.Generator — do not edit by hand.
defmodule Text.Stemmer.Stemmers.Lithuanian do
@moduledoc """
Snowball stemmer for lithuanian.
Generated from the canonical Snowball algorithm source.
"""
alias Snowball.Runtime
alias Snowball.Grouping
# Groupings
@g_v Grouping.from_string("aeiyouąęįųėū")
# Among tables
@a_0 [
{"gd", -1, 1, nil}
]
@a_1 [
{"č", -1, 1, nil},
{"dž", -1, 2, nil}
]
@a_2 [
{"ojime", -1, 9, nil},
{"ėjime", -1, 5, nil},
{"avime", -1, 8, nil},
{"okate", -1, 11, nil},
{"aite", -1, 1, nil},
{"uote", -1, 4, nil},
{"asius", -1, 7, nil},
{"okatės", -1, 10, nil},
{"aitės", -1, 2, nil},
{"uotės", -1, 3, nil},
{"esiu", -1, 6, nil}
]
@a_3 [
{"ing", -1, -1, nil},
{"aj", -1, -1, nil},
{"iaj", 1, -1, nil},
{"iej", -1, -1, nil},
{"oj", -1, -1, nil},
{"ioj", 4, -1, nil},
{"uoj", 4, -1, nil},
{"iuoj", 6, -1, nil},
{"auj", -1, -1, nil},
{"ąj", -1, -1, nil},
{"iąj", 9, -1, nil},
{"ėj", -1, -1, nil},
{"ųj", -1, -1, nil},
{"iųj", 12, -1, nil},
{"ok", -1, -1, nil},
{"iok", 14, -1, nil},
{"iuk", -1, -1, nil},
{"uliuk", 16, -1, nil},
{"učiuk", 16, -1, nil},
{"išk", -1, -1, nil},
{"iul", -1, -1, nil},
{"yl", -1, -1, nil},
{"ėl", -1, -1, nil},
{"am", -1, -1, nil},
{"dam", 23, -1, nil},
{"jam", 23, -1, nil},
{"zgan", -1, -1, nil},
{"ain", -1, -1, nil},
{"esn", -1, -1, nil},
{"op", -1, -1, nil},
{"iop", 29, -1, nil},
{"ias", -1, -1, nil},
{"ies", -1, -1, nil},
{"ais", -1, -1, nil},
{"iais", 33, -1, nil},
{"os", -1, -1, nil},
{"ios", 35, -1, nil},
{"uos", 35, -1, nil},
{"iuos", 37, -1, nil},
{"aus", -1, -1, nil},
{"iaus", 39, -1, nil},
{"ąs", -1, -1, nil},
{"iąs", 41, -1, nil},
{"ęs", -1, -1, nil},
{"utėait", -1, -1, nil},
{"ant", -1, -1, nil},
{"iant", 45, -1, nil},
{"siant", 46, -1, nil},
{"int", -1, -1, nil},
{"ot", -1, -1, nil},
{"uot", 49, -1, nil},
{"iuot", 50, -1, nil},
{"yt", -1, -1, nil},
{"ėt", -1, -1, nil},
{"ykšt", -1, -1, nil},
{"iau", -1, -1, nil},
{"dav", -1, -1, nil},
{"sv", -1, -1, nil},
{"šv", -1, -1, nil},
{"ykšč", -1, -1, nil},
{"ę", -1, -1, nil},
{"ėję", 60, -1, nil}
]
@a_4 [
{"a", -1, -1, nil},
{"ia", 0, -1, nil},
{"osna", 0, -1, nil},
{"iosna", 2, -1, nil},
{"uosna", 2, -1, nil},
{"iuosna", 4, -1, nil},
{"ysna", 0, -1, nil},
{"ėsna", 0, -1, nil},
{"e", -1, -1, nil},
{"ie", 8, -1, nil},
{"enie", 9, -1, nil},
{"oje", 8, -1, nil},
{"ioje", 11, -1, nil},
{"uje", 8, -1, nil},
{"iuje", 13, -1, nil},
{"yje", 8, -1, nil},
{"enyje", 15, -1, nil},
{"ėje", 8, -1, nil},
{"ame", 8, -1, nil},
{"iame", 18, -1, nil},
{"sime", 8, -1, nil},
{"ome", 8, -1, nil},
{"ėme", 8, -1, nil},
{"tumėme", 22, -1, nil},
{"ose", 8, -1, nil},
{"iose", 24, -1, nil},
{"uose", 24, -1, nil},
{"iuose", 26, -1, nil},
{"yse", 8, -1, nil},
{"enyse", 28, -1, nil},
{"ėse", 8, -1, nil},
{"ate", 8, -1, nil},
{"iate", 31, -1, nil},
{"ite", 8, -1, nil},
{"kite", 33, -1, nil},
{"site", 33, -1, nil},
{"ote", 8, -1, nil},
{"tute", 8, -1, nil},
{"ėte", 8, -1, nil},
{"tumėte", 38, -1, nil},
{"i", -1, -1, nil},
{"ai", 40, -1, nil},
{"iai", 41, -1, nil},
{"ei", 40, -1, nil},
{"tumei", 43, -1, nil},
{"ki", 40, -1, nil},
{"imi", 40, -1, nil},
{"umi", 40, -1, nil},
{"iumi", 47, -1, nil},
{"si", 40, -1, nil},
{"asi", 49, -1, nil},
{"iasi", 50, -1, nil},
{"esi", 49, -1, nil},
{"iesi", 52, -1, nil},
{"siesi", 53, -1, nil},
{"isi", 49, -1, nil},
{"aisi", 55, -1, nil},
{"eisi", 55, -1, nil},
{"tumeisi", 57, -1, nil},
{"uisi", 55, -1, nil},
{"osi", 49, -1, nil},
{"ėjosi", 60, -1, nil},
{"uosi", 60, -1, nil},
{"iuosi", 62, -1, nil},
{"siuosi", 63, -1, nil},
{"usi", 49, -1, nil},
{"ausi", 65, -1, nil},
{"čiausi", 66, -1, nil},
{"ąsi", 49, -1, nil},
{"ėsi", 49, -1, nil},
{"ųsi", 49, -1, nil},
{"tųsi", 70, -1, nil},
{"ti", 40, -1, nil},
{"enti", 72, -1, nil},
{"inti", 72, -1, nil},
{"oti", 72, -1, nil},
{"ioti", 75, -1, nil},
{"uoti", 75, -1, nil},
{"iuoti", 77, -1, nil},
{"auti", 72, -1, nil},
{"iauti", 79, -1, nil},
{"yti", 72, -1, nil},
{"ėti", 72, -1, nil},
{"telėti", 82, -1, nil},
{"inėti", 82, -1, nil},
{"terėti", 82, -1, nil},
{"ui", 40, -1, nil},
{"iui", 86, -1, nil},
{"eniui", 87, -1, nil},
{"oj", -1, -1, nil},
{"ėj", -1, -1, nil},
{"k", -1, -1, nil},
{"am", -1, -1, nil},
{"iam", 92, -1, nil},
{"iem", -1, -1, nil},
{"im", -1, -1, nil},
{"sim", 95, -1, nil},
{"om", -1, -1, nil},
{"tum", -1, -1, nil},
{"ėm", -1, -1, nil},
{"tumėm", 99, -1, nil},
{"an", -1, -1, nil},
{"on", -1, -1, nil},
{"ion", 102, -1, nil},
{"un", -1, -1, nil},
{"iun", 104, -1, nil},
{"ėn", -1, -1, nil},
{"o", -1, -1, nil},
{"io", 107, -1, nil},
{"enio", 108, -1, nil},
{"ėjo", 107, -1, nil},
{"uo", 107, -1, nil},
{"s", -1, -1, nil},
{"as", 112, -1, nil},
{"ias", 113, -1, nil},
{"es", 112, -1, nil},
{"ies", 115, -1, nil},
{"is", 112, -1, nil},
{"ais", 117, -1, nil},
{"iais", 118, -1, nil},
{"tumeis", 117, -1, nil},
{"imis", 117, -1, nil},
{"enimis", 121, -1, nil},
{"omis", 117, -1, nil},
{"iomis", 123, -1, nil},
{"umis", 117, -1, nil},
{"ėmis", 117, -1, nil},
{"enis", 117, -1, nil},
{"asis", 117, -1, nil},
{"ysis", 117, -1, nil},
{"ams", 112, -1, nil},
{"iams", 130, -1, nil},
{"iems", 112, -1, nil},
{"ims", 112, -1, nil},
{"enims", 133, -1, nil},
{"oms", 112, -1, nil},
{"ioms", 135, -1, nil},
{"ums", 112, -1, nil},
{"ėms", 112, -1, nil},
{"ens", 112, -1, nil},
{"os", 112, -1, nil},
{"ios", 140, -1, nil},
{"uos", 140, -1, nil},
{"iuos", 142, -1, nil},
{"us", 112, -1, nil},
{"aus", 144, -1, nil},
{"iaus", 145, -1, nil},
{"ius", 144, -1, nil},
{"ys", 112, -1, nil},
{"enys", 148, -1, nil},
{"ąs", 112, -1, nil},
{"iąs", 150, -1, nil},
{"ės", 112, -1, nil},
{"amės", 152, -1, nil},
{"iamės", 153, -1, nil},
{"imės", 152, -1, nil},
{"kimės", 155, -1, nil},
{"simės", 155, -1, nil},
{"omės", 152, -1, nil},
{"ėmės", 152, -1, nil},
{"tumėmės", 159, -1, nil},
{"atės", 152, -1, nil},
{"iatės", 161, -1, nil},
{"sitės", 152, -1, nil},
{"otės", 152, -1, nil},
{"ėtės", 152, -1, nil},
{"tumėtės", 165, -1, nil},
{"ūs", 112, -1, nil},
{"įs", 112, -1, nil},
{"tųs", 112, -1, nil},
{"at", -1, -1, nil},
{"iat", 170, -1, nil},
{"it", -1, -1, nil},
{"sit", 172, -1, nil},
{"ot", -1, -1, nil},
{"ėt", -1, -1, nil},
{"tumėt", 175, -1, nil},
{"u", -1, -1, nil},
{"au", 177, -1, nil},
{"iau", 178, -1, nil},
{"čiau", 179, -1, nil},
{"iu", 177, -1, nil},
{"eniu", 181, -1, nil},
{"siu", 181, -1, nil},
{"y", -1, -1, nil},
{"ą", -1, -1, nil},
{"ią", 185, -1, nil},
{"ė", -1, -1, nil},
{"ę", -1, -1, nil},
{"į", -1, -1, nil},
{"enį", 189, -1, nil},
{"ų", -1, -1, nil},
{"ių", 191, -1, nil}
]
@doc """
Stem a word.
### Arguments
* `word` is a UTF-8 binary.
### Returns
* The stemmed UTF-8 binary.
"""
@spec stem(binary()) :: binary()
def stem(word) when is_binary(word) do
state = Runtime.new(word) |> init_vars()
state = run_stem(state)
Runtime.assign_to(state)
end
defp init_vars(state), do: %{state | vars: %{p1: 0}}
defp run_stem(%Runtime{} = state) do
{_, state} = r_stem(state)
state
end
# Snowball runtime helpers.
defp snowball_do_f(state, fun) do
saved_c = state.cursor
{_, s} = fun.(state)
%{s | cursor: saved_c}
end
defp snowball_do_b(state, fun) do
rel = state.limit - state.cursor
{_, s} = fun.(state)
%{s | cursor: s.limit - rel}
end
defp snowball_try(state, fun) do
rel = state.limit - state.cursor
case fun.(state) do
{:ok, s} -> s
{:fail, s} -> %{s | cursor: s.limit - rel}
end
end
defp lift(state, :fail), do: {:fail, state}
defp lift(_state, %Runtime{} = s), do: {:ok, s}
defp next_codepoint(%Runtime{cursor: c, limit: lim, current: cur} = state) do
case Runtime.codepoint_at(cur, c, lim) do
{_cp, size} -> {:ok, %{state | cursor: c + size}}
:error -> {:fail, state}
end
end
defp r_fix_gd(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_0) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_from(state, "g")}
_ -> {:ok, state}
end
end
end).()
end
defp r_fix_chdz(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_1) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_from(state, "t")}
2 ->
{:ok, Runtime.slice_from(state, "d")}
_ -> {:ok, state}
end
end
end).()
end
defp r_fix_conflicts(%Runtime{} = state) do
(fn ->
state = %{state | ket: state.cursor}
case Runtime.find_among_b(state, @a_2) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | bra: s.cursor}
case result do
1 ->
{:ok, Runtime.slice_from(state, "aitė")}
2 ->
{:ok, Runtime.slice_from(state, "aitė")}
3 ->
{:ok, Runtime.slice_from(state, "uotė")}
4 ->
{:ok, Runtime.slice_from(state, "uotė")}
5 ->
{:ok, Runtime.slice_from(state, "ėjimas")}
6 ->
{:ok, Runtime.slice_from(state, "esys")}
7 ->
{:ok, Runtime.slice_from(state, "asys")}
8 ->
{:ok, Runtime.slice_from(state, "avimas")}
9 ->
{:ok, Runtime.slice_from(state, "ojimas")}
10 ->
{:ok, Runtime.slice_from(state, "okatė")}
11 ->
{:ok, Runtime.slice_from(state, "okatė")}
_ -> {:ok, state}
end
end
end).()
end
defp r_step2(%Runtime{} = state) do
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
case (fn state ->
case (fn state ->
(fn ->
old_limit = state.limit_backward
case (fn state ->
(fn ->
target = state.vars[:p1]
if target < state.limit_backward or target > state.limit do
{:fail, state}
else
{:ok, %{state | cursor: target}}
end
end).()
end).(state) do
{:fail, _} -> {:fail, state}
{:ok, limit_state} ->
state = %{state | ket: state.cursor, limit_backward: limit_state.cursor}
case Runtime.find_among_b(state, @a_3) do
:fail -> {:fail, %{state | limit_backward: old_limit}}
{%Runtime{} = s, _result} ->
state = %{s | bra: s.cursor, limit_backward: old_limit}
{:ok, state}
end
end
end).()
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
end).(state) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, s} -> {:ok, %{s | cursor: state.cursor}}
end
end)
end
defp r_step1(%Runtime{} = state) do
case (fn state ->
(fn ->
old_limit = state.limit_backward
case (fn state ->
(fn ->
target = state.vars[:p1]
if target < state.limit_backward or target > state.limit do
{:fail, state}
else
{:ok, %{state | cursor: target}}
end
end).()
end).(state) do
{:fail, _} -> {:fail, state}
{:ok, limit_state} ->
state = %{state | ket: state.cursor, limit_backward: limit_state.cursor}
case Runtime.find_among_b(state, @a_4) do
:fail -> {:fail, %{state | limit_backward: old_limit}}
{%Runtime{} = s, _result} ->
state = %{s | bra: s.cursor, limit_backward: old_limit}
{:ok, state}
end
end
end).()
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
r -> r
end
end
defp r_stem(%Runtime{} = state) do
case (fn state ->
{:ok, put_in(state.vars[:p1], state.limit)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
{:ok, snowball_try(state, fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "a"))
end).(state) do
{:ok, state} ->
if Runtime.codepoint_length(state.current) > 6, do: {:ok, state}, else: {:fail, state}
r -> r
end
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
case Runtime.go_out_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
case (fn state ->
case Runtime.go_in_grouping(state, @g_v) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:p1], state.cursor)}
r -> r
end
r -> r
end
end
end)}
end).(state) do
{:ok, state} ->
(fn state ->
old_cursor = state.cursor
old_lb = state.limit_backward
state = %{state | cursor: state.limit, limit_backward: old_cursor}
{tag, s} = (fn state ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_fix_conflicts(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_step1(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_fix_chdz(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_step2(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_b(state, fn state ->
r_fix_chdz(state)
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_b(state, fn state ->
r_fix_gd(state)
end)}
end
end
end
end
end
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
end
end
end
end