Packages

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
text_stemmer lib text stemmer stemmers indonesian.ex
Raw

lib/text/stemmer/stemmers/indonesian.ex

# Generated by Snowball.Generator — do not edit by hand.
defmodule Text.Stemmer.Stemmers.Indonesian do
@moduledoc """
Snowball stemmer for indonesian.
Generated from the canonical Snowball algorithm source.
"""
alias Snowball.Runtime
alias Snowball.Grouping
# Groupings
@g_vowel Grouping.from_string("aeiou")
# Among tables
@a_0 [
{"i", -1, 2, nil},
{"an", -1, 1, nil}
]
@a_1 [
{"nya", -1, 1, nil},
{"ku", -1, 1, nil},
{"mu", -1, 1, nil}
]
@a_2 [
{"kah", -1, 1, nil},
{"lah", -1, 1, nil},
{"pun", -1, 1, nil}
]
@a_3 [
{"di", -1, 1, nil},
{"ke", -1, 3, nil},
{"me", -1, 1, nil},
{"mem", 2, 5, nil},
{"men", 2, 2, nil},
{"meng", 4, 1, nil},
{"pem", -1, 6, nil},
{"pen", -1, 4, nil},
{"peng", 7, 3, nil},
{"ter", -1, 1, nil}
]
@a_4 [
{"be", -1, 2, nil},
{"pe", -1, 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: %{measure: 0, prefix: 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_test_f(state, fun) do
saved_c = state.cursor
case fun.(state) do
{:ok, s} -> {:ok, %{s | cursor: saved_c}}
{:fail, s} -> {:fail, %{s | cursor: saved_c}}
end
end
defp snowball_test_b(state, fun) do
rel = state.limit - state.cursor
case fun.(state) do
{:ok, s} -> {:ok, %{s | cursor: s.limit - rel}}
{:fail, s} -> {:fail, %{s | cursor: s.limit - rel}}
end
end
defp snowball_or(state, fun1, fun2) do
rel = state.limit - state.cursor
case fun1.(state) do
{:ok, s} -> {:ok, s}
{:fail, s} -> fun2.(%{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_remove_suffix(%Runtime{} = state) do
case (fn state ->
(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 ->
snowball_or(state,
fn state ->
case (fn state ->
case (fn state ->
snowball_test_b(state, fn state ->
if state.vars[:prefix] != 3, do: {:ok, state}, else: {:fail, state}
end)
end).(state) do
{:ok, state} ->
if state.vars[:prefix] != 2, do: {:ok, state}, else: {:fail, state}
r -> r
end
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.eq_s_b(state, "k"))
end).(state) do
{:ok, state} ->
{:ok, %{state | bra: state.cursor}}
r -> r
end
r -> r
end
end,
fn state ->
if state.vars[:prefix] != 1, do: {:ok, state}, else: {:fail, state}
end)
2 ->
case (fn state ->
if state.vars[:prefix] <= 2, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
(fn state ->
saved_c = state.cursor
case (fn state ->
lift(state, Runtime.eq_s_b(state, "s"))
end).(state) do
{:ok, s} -> {:fail, %{s | cursor: saved_c}}
{:fail, s} -> {:ok, %{s | cursor: saved_c}}
end
end).(state)
r -> r
end
_ -> {:ok, state}
end
end
end).()
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
r -> r
end
end
defp r_remove_possessive_pronoun(%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 ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
_ -> {:ok, state}
end
end
end).()
end
defp r_remove_particle(%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 ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
_ -> {:ok, state}
end
end
end).()
end
defp r_remove_first_order_prefix(%Runtime{} = state) do
(fn ->
state = %{state | bra: state.cursor}
case Runtime.find_among(state, @a_3) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = %{s | ket: s.cursor}
case result do
1 ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 1)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
2 ->
snowball_or(state,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "y"))
end).(state) do
{:ok, state} ->
case (fn state ->
snowball_test_f(state, fn state ->
lift(state, Runtime.in_grouping(state, @g_vowel))
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_from(state, "s")}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 1)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
end
r -> r
end
r -> r
end
end,
fn state ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 1)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
end)
3 ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 3)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
4 ->
snowball_or(state,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "y"))
end).(state) do
{:ok, state} ->
case (fn state ->
snowball_test_f(state, fn state ->
lift(state, Runtime.in_grouping(state, @g_vowel))
end)
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, Runtime.slice_from(state, "s")}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 3)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
end
r -> r
end
r -> r
end
end,
fn state ->
case (fn state ->
{:ok, Runtime.slice_del(state)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 3)}
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end
end
end)
5 ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 1)}
end).(state) do
{:ok, state} ->
case (fn state ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
case (fn state ->
snowball_test_f(state, fn state ->
lift(state, Runtime.in_grouping(state, @g_vowel))
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "p")}
r -> r
end
end,
fn state ->
{:ok, Runtime.slice_del(state)}
end)
end
end
6 ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 3)}
end).(state) do
{:ok, state} ->
case (fn state ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
case (fn state ->
snowball_test_f(state, fn state ->
lift(state, Runtime.in_grouping(state, @g_vowel))
end)
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_from(state, "p")}
r -> r
end
end,
fn state ->
{:ok, Runtime.slice_del(state)}
end)
end
end
_ -> {:ok, state}
end
end
end).()
end
defp r_remove_second_order_prefix(%Runtime{} = state) do
case (fn state ->
{:ok, %{state | bra: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
(fn ->
case Runtime.find_among(state, @a_4) do
:fail -> {:fail, state}
{%Runtime{} = s, result} ->
state = s
case result do
1 ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "r"))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:prefix], 2)}
end
r -> r
end
end,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "l"))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
lift(state, Runtime.eq_s(state, "ajar"))
end
r -> r
end
end)
end,
fn state ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:prefix], 2)}
end
end)
2 ->
case (fn state ->
snowball_or(state,
fn state ->
snowball_or(state,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "r"))
end).(state) do
{:ok, state} ->
{:ok, %{state | ket: state.cursor}}
r -> r
end
end,
fn state ->
case (fn state ->
lift(state, Runtime.eq_s(state, "l"))
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
lift(state, Runtime.eq_s(state, "ajar"))
end
r -> r
end
end)
end,
fn state ->
case (fn state ->
{:ok, %{state | ket: state.cursor}}
end).(state) do
{:ok, state} ->
case (fn state ->
lift(state, Runtime.out_grouping(state, @g_vowel))
end).(state) do
{:ok, state} ->
lift(state, Runtime.eq_s(state, "er"))
r -> r
end
end
end)
end).(state) do
{:ok, state} ->
{:ok, put_in(state.vars[:prefix], 4)}
r -> r
end
_ -> {:ok, s}
end
end
end).()
end).(state) do
{:ok, state} ->
case (fn state ->
(fn ->
new_val = state.vars[:measure] - 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
end).(state) do
{:ok, state} ->
{:ok, Runtime.slice_del(state)}
end
r -> r
end
end
end
defp r_stem(%Runtime{} = state) do
case (fn state ->
{:ok, put_in(state.vars[:measure], 0)}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
(fn loop_fn ->
loop_fn.(loop_fn, state)
end).(fn loop_fn, state ->
case (fn state ->
case (fn state ->
case Runtime.go_out_grouping(state, @g_vowel) do
:fail -> {:fail, state}
%Runtime{} = s -> next_codepoint(s)
end
end).(state) do
{:ok, state} ->
(fn ->
new_val = state.vars[:measure] + 1
{:ok, put_in(state.vars[:measure], new_val)}
end).()
r -> r
end
end).(state) do
{:ok, s} -> loop_fn.(loop_fn, s)
{:fail, s} -> {:ok, %{s | cursor: state.cursor}}
end
end)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
case (fn state ->
{:ok, put_in(state.vars[:prefix], 0)}
end).(state) do
{:ok, state} ->
case (fn 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_remove_particle(state)
end)}
end).(state) do
{:ok, state} ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_b(state, fn state ->
r_remove_possessive_pronoun(state)
end)}
r -> r
end
end
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
end).(state) do
{:ok, state} ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
snowball_or(state,
fn state ->
snowball_test_f(state, fn state ->
case (fn state ->
r_remove_first_order_prefix(state)
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
snowball_test_f(state, fn state ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
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 ->
r_remove_suffix(state)
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
r -> r
end
end)
end).(state) do
{:ok, state} ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
end).(state) do
{:ok, state} ->
r_remove_second_order_prefix(state)
r -> r
end
r -> r
end
end)}
r -> r
end
end)
end,
fn state ->
case (fn state ->
{:ok, snowball_do_f(state, fn state ->
r_remove_second_order_prefix(state)
end)}
end).(state) do
{:ok, state} ->
{:ok, snowball_do_f(state, fn state ->
case (fn state ->
if state.vars[:measure] > 2, do: {:ok, state}, else: {:fail, state}
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 ->
r_remove_suffix(state)
end).(state)
{tag, %{s | cursor: old_cursor, limit_backward: old_lb}}
end).(state)
r -> r
end
end)}
end
end)
r -> r
end
r -> r
end
end
r -> r
end
end
end
end
end