Skip to content

Instantly share code, notes, and snippets.

@tamanugi
Last active August 21, 2022 01:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tamanugi/3abf41e02187be34f9d6a429a70dd446 to your computer and use it in GitHub Desktop.
Save tamanugi/3abf41e02187be34f9d6a429a70dd446 to your computer and use it in GitHub Desktop.
Tokenized using by Trie-Tree
defmodule Trie do
def build(binaries) when is_list(binaries) do
binaries
|> Enum.reduce(%{}, &_insert(&2, &1))
end
defp _insert(trie, binary) when is_binary(binary) do
_insert(trie, String.codepoints(binary))
end
defp _insert(trie, [next | rest]) do
case Map.has_key?(trie, next) do
true -> Map.put(trie, next, _insert(trie[next], rest))
false -> Map.put(trie, next, _insert(%{}, rest))
end
end
defp _insert(trie, []) do
Map.put(trie, :mark, :mark)
end
end
defmodule Tokenizer do
def tokenize(text, terms) do
trie_tree = Trie.build(terms)
text
|> String.codepoints()
|> _tokenize(trie_tree)
end
defp enum_pop(rest, 0), do: rest
defp enum_pop([_ | t], count), do: enum_pop(t, count - 1)
defp _tokenize(text_list, tri_tree, buffer \\ "", acc \\ [])
defp _tokenize([], _, "", acc), do: acc |> Enum.reverse()
defp _tokenize([], _, buffer, acc), do: [buffer | acc] |> Enum.reverse()
defp _tokenize([next | rest] = text_list, tree, buffer, acc) do
case Map.has_key?(tree, next) do
false ->
_tokenize(rest, tree, buffer <> next, acc)
true ->
case find([next | rest], tree, "", "") do
"" ->
_tokenize(rest, tree, buffer <> next, acc)
find_text ->
acc = case buffer do
"" -> [find_text | acc]
b -> [find_text, b | acc]
end
rest = enum_pop(text_list, String.length(find_text))
_tokenize(rest, tree, "", acc)
end
end
end
defp find([], %{mark: :mark}, text, _), do: text
defp find([], _, _, memo), do: memo
defp find([next | rest], node, text, memo) do
memo =
case Map.has_key?(node, :mark) do
true -> text
false -> memo
end
text = text <> next
case Map.get(node, next) do
nil -> memo
next_node -> find(rest, next_node, text, memo)
end
end
end
# ランダム
defmodule Generator do
def randstr(length), do: _randstr([], length)
defp _randstr(list, length) when length(list) >= length, do: Enum.join(list)
defp _randstr(list, length) when length(list) < length do
char =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|> String.codepoints()
|> Enum.take_random(1)
|> List.first()
_randstr([char | list], length)
end
def generate(length, size) do
{
randstr(length),
1..size |> Enum.map(fn _ -> randstr(:rand.uniform(length)) end)
}
end
end
{text , terms} = Generator.generate(1000, 1000)
:timer.tc(Tokenizer, :tokenize, [text, terms])
|> elem(0)
|> IO.inspect(label: "ランダム実行秒数(μs)")
# 日本語テキスト
IO.puts("")
text =
"""
私はその間いやいやその講演っ放しというののところが見下しますです。いよいよ結果に観念らは何しろその思案でたでもにするでみたには承諾這入るでるて、少しには伴っませたましな。間接に暮らしだものはきっと当時をようやくたならだ。まあ大森さんを評自分もう少し交渉を打ち壊さある態度そんながたこれか詐欺をについて今煩悶たですなけれなから、その今度も私か権力頭を怠けて、大森さんのので知人の私におおかたご解とするば私自分をごお断りに作るようにすなわちお講義にありたたて、まるでちゃんと関係に臥せっないてしまいましのがするたごとく。
つまりところがお心をしものはいっそ主と行かですて、その手本へもしたいてとして次をきめてしまっでしょだ。どんな中心の上この賞もそれ中でもっでかと嘉納さんで与えだた、働の生涯ますというご汚辱ですありなかっが、男のところに俗人から今かもの犠牲に絶対してもらって、ますますの偶然を知れてどんな末をとにかく下すたないとできるたのですば、古いたたが少々お状態罹っですのたあるない。
たとえば差か真面目か発展に愛するですて、時分末足をせけれどもいるだために肝推察のほかに吹き込んました。
"""
terms = ~w(私 結果 観念 いや いやいや 次をきめて お心をしものは 心 中心 この章は)
Tokenizer.tokenize(text, terms) |> IO.inspect(label: "日本語実行結果")
@tamanugi
Copy link
Author

tamanugi commented Aug 21, 2022

手元での実行結果

ランダム実行秒数(μs): 74670

日本語実行結果: ["私", "はその間", "いやいや",
 "その講演っ放しというののところが見下しますです。いよいよ",
 "結果", "に", "観念",
 "らは何しろその思案でたでもにするでみたには承諾這入るでるて、少しには伴っませたましな。間接に暮らしだものはきっと当時をようやくたならだ。まあ大森さんを評自分もう少し交渉を打ち壊さある態度そんながたこれか詐欺をについて今煩悶たですなけれなから、その今度も",
 "私", "か権力頭を怠けて、大森さんのので知人の", "私",
 "におおかたご解とするば", "私",
 "自分をごお断りに作るようにすなわちお講義にありたたて、まるでちゃんと関係に臥せっないてしまいましのがするたごとく。\nつまりところが",
 "お心をしものは",
 "いっそ主と行かですて、その手本へもしたいてとして",
 "次をきめて", "しまっでしょだ。どんな", "中心",
 "の上この賞もそれ中でもっでかと嘉納さんで与えだた、働の生涯ますというご汚辱ですありなかっが、男のところに俗人から今かもの犠牲に絶対してもらって、ますますの偶然を知れてどんな末をとにかく下すたないとできるたのですば、古いたたが少々お状態罹っですのたあるない。\nたとえば差か真面目か発展に愛するですて、時分末足をせけれどもいるだために肝推察のほかに吹き込んました。\n"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment