Last active
August 21, 2022 01:40
-
-
Save tamanugi/3abf41e02187be34f9d6a429a70dd446 to your computer and use it in GitHub Desktop.
Tokenized using by Trie-Tree
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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: "日本語実行結果") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
手元での実行結果