X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=app%2FModels%2FChatLib.php;h=3f1530b396b9b752652918c45d9f0a0fdea3d596;hb=26d47ca368d8e7c2690cec49f6ae2ad509a0428d;hp=8134d136b61122c22847193e0402e28d1a0ed281;hpb=f18af7cfb219ab9c07635ea8bbae80f2a9cee78e;p=alttp.git diff --git a/app/Models/ChatLib.php b/app/Models/ChatLib.php index 8134d13..3f1530b 100644 --- a/app/Models/ChatLib.php +++ b/app/Models/ChatLib.php @@ -2,82 +2,67 @@ namespace App\Models; +use Illuminate\Support\Facades\Storage; + class ChatLib { - public function addMessage($msg) { - $tokens = array_values(array_filter(preg_split('/\s+/u', $msg->text_content))); + public function addMessage(ChatLog $msg) { + $this->addText($msg->text_content); + } + + public function addText($text) { + $tokens = $this->tokenize($text); if (empty($tokens)) return; - $tokens [] = ''; + $tokens[] = ''; foreach ($tokens as $num => $token) { if ($num === 0) { - $this->addStart($token); - } - if ($num > 0) { - $this->addOne($tokens[$num - 1], $token); - } - if ($num > 1) { - $this->addTwo($tokens[$num - 2], $tokens[$num - 1], $token); - } - if ($num > 2) { - $this->addThree($tokens[$num - 3], $tokens[$num - 2], $tokens[$num - 1], $token); - } - if ($num > 3) { - $this->addFour($tokens[$num - 4], $tokens[$num - 3], $tokens[$num - 2], $tokens[$num - 1], $token); - } - if ($num > 4) { - $this->addFive($tokens[$num - 5], $tokens[$num - 4], $tokens[$num - 3], $tokens[$num - 2], $tokens[$num - 1], $token); + $this->addTransition([], $token); + } else { + $start = max(0, $num - $this->size - 1); + $end = $num; + for ($i = $start; $i < $end; ++$i) { + $this->addTransition(array_slice($tokens, $i, $end - $i), $token); + if ($end - $i < 5) break; + } } } } public function compile() { - $this->start = $this->index($this->start); - foreach ($this->one as $key => $value) { - $this->one[$key] = $this->index($this->one[$key]); - if (empty($this->one[$key])) { - unset($this->one[$key]); - } - } - foreach ($this->two as $key => $value) { - $this->two[$key] = $this->index($this->two[$key]); - if (empty($this->two[$key])) { - unset($this->two[$key]); - } - } - foreach ($this->three as $key => $value) { - $this->three[$key] = $this->index($this->three[$key]); - if (empty($this->three[$key])) { - unset($this->three[$key]); - } - } - foreach ($this->four as $key => $value) { - $this->four[$key] = $this->index($this->four[$key]); - if (empty($this->four[$key])) { - unset($this->four[$key]); - } - } - foreach ($this->five as $key => $value) { - $this->five[$key] = $this->index($this->five[$key]); - if (empty($this->five[$key])) { - unset($this->five[$key]); + foreach ($this->transitions as $key => $value) { + $this->transitions[$key] = $this->index($this->transitions[$key]); + if (empty($this->transitions[$key])) { + unset($this->transitions[$key]); } } } - public function generate($limit = 75) { - $tokens = []; - $start = $this->randomStart(); - $tokens[] = $start; - $generated = $start; + public function generate($limit = 100) { + $tokens = ['']; + $generated = ''; while (strlen($generated) < $limit) { $next = $this->randomNext($tokens); - if (empty($next)) break; + if ($next === '') break; $tokens[] = $next; - $generated .= ' '.$next; + $generated .= $next; } return $generated; } + public function saveAs($name) { + $data = [ + 'size' => $this->size, + 'transitions' => $this->transitions, + ]; + Storage::disk('chatlib')->put($name.'.json', json_encode($data)); + } + + public function loadFrom($name) { + $data = json_decode(Storage::disk('chatlib')->get($name.'.json'), true); + $this->size = $data['size']; + $this->transitions = $data['transitions']; + } + private function index($arr) { $result = []; $sum = 0; @@ -85,16 +70,18 @@ class ChatLib { $weight = $entry['count']; if ($weight == 1) continue; $lower = $sum; - $sum += intval(pow($weight, 1.4)); + $sum += $weight; $examples = []; if (is_array(end($entry['examples']))) { // already processed $examples = $entry['examples']; + } else if ($key === ' ') { + $examples = [[' ', 0, 1]]; } else { $subsum = 0; foreach ($entry['examples'] as $example => $subweight) { $sublower = $subsum; - $subsum += $subweight * $subweight; + $subsum += $subweight; $examples[] = [$example, $sublower, $subsum]; } } @@ -103,79 +90,18 @@ class ChatLib { return $result; } - private function randomStart() { - $pick = $this->pick($this->start); - if (is_null($pick)) return ''; - return $this->exampleOf($pick); - } - private function randomNext($tokens) { $cnt = count($tokens); - $picks = []; - if ($cnt >= 5) { - $cmb = $this->generalize(array_slice($tokens, $cnt - 5, 5)); - if (isset($this->five[$cmb])) { - $pick = $this->pick($this->five[$cmb]); - if (!is_null($pick)) { - $picks[$pick[0]] = [ - 'count' => 10, - 'examples' => $pick[3], - ]; - } - } - } - if ($cnt >= 4) { - $cmb = $this->generalize(array_slice($tokens, $cnt - 4, 4)); - if (isset($this->four[$cmb])) { - $pick = $this->pick($this->four[$cmb]); + for ($size = min($this->size, $cnt); $size > 0; --$size) { + $cmb = $this->generalize(array_slice($tokens, -$size)); + if (isset($this->transitions[$cmb])) { + $pick = $this->pick($this->transitions[$cmb]); if (!is_null($pick)) { - $picks[$pick[0]] = [ - 'count' => 12, - 'examples' => $pick[3], - ]; + return $this->exampleOf($pick); } } } - if ($cnt >= 3) { - $cmb = $this->generalize(array_slice($tokens, $cnt - 3, 3)); - if (isset($this->three[$cmb])) { - $pick = $this->pick($this->three[$cmb]); - if (!is_null($pick)) { - $picks[$pick[0]] = [ - 'count' => 14, - 'examples' => $pick[3], - ]; - } - } - } - if ($cnt >= 2) { - $cmb = $this->generalize(array_slice($tokens, $cnt - 2, 2)); - if (isset($this->two[$cmb])) { - $pick = $this->pick($this->two[$cmb]); - if (!is_null($pick)) { - $picks[$pick[0]] = [ - 'count' => 4, - 'examples' => $pick[3], - ]; - } - } - } - if ($cnt >= 1) { - $cmb = $this->generalize(array_slice($tokens, $cnt - 1, 1)); - if (isset($this->one[$cmb])) { - $pick = $this->pick($this->one[$cmb]); - if (!is_null($pick)) { - $picks[$pick[0]] = [ - 'count' => 2, - 'examples' => $pick[3], - ]; - } - } - } - if (empty($picks)) return ''; - $picks = $this->index($picks); - $pick = $this->pick($picks); - return $this->exampleOf($pick); + return ''; } private function pick($options) { @@ -200,49 +126,12 @@ class ChatLib { return $options[$min_index]; } - private function addStart($token) { - if (empty($token)) return; - $this->increment($this->start, $token); - } - - private function addOne($one, $token) { - $cmb = $this->generalize([$one]); - if (!isset($this->one[$cmb])) { - $this->one[$cmb] = []; + private function addTransition($state, $next) { + $cmb = $this->generalize($state); + if (!isset($this->transitions[$cmb])) { + $this->transitions[$cmb] = []; } - $this->increment($this->one[$cmb], $token); - } - - private function addTwo($one, $two, $token) { - $cmb = $this->generalize([$one, $two]); - if (!isset($this->two[$cmb])) { - $this->two[$cmb] = []; - } - $this->increment($this->two[$cmb], $token); - } - - private function addThree($one, $two, $three, $token) { - $cmb = $this->generalize([$one, $two, $three]); - if (!isset($this->three[$cmb])) { - $this->three[$cmb] = []; - } - $this->increment($this->three[$cmb], $token); - } - - private function addFour($one, $two, $three, $four, $token) { - $cmb = $this->generalize([$one, $two, $three, $four]); - if (!isset($this->four[$cmb])) { - $this->four[$cmb] = []; - } - $this->increment($this->four[$cmb], $token); - } - - private function addFive($one, $two, $three, $four, $five, $token) { - $cmb = $this->generalize([$one, $two, $three, $four, $five]); - if (!isset($this->five[$cmb])) { - $this->five[$cmb] = []; - } - $this->increment($this->five[$cmb], $token); + $this->increment($this->transitions[$cmb], $next); } private function increment(&$which, $token) { @@ -263,13 +152,22 @@ class ChatLib { } } + private function tokenize($str) { + return array_values(array_filter(preg_split('/\b/u', $str), function($token) { + if (empty($token)) return false; + if (preg_match('/cheer\d+/u', strtolower($token))) return false; + return true; + })); + } + private function generalize($tokens) { $str = ''; foreach ($tokens as $token) { - $replaced = preg_replace('/\W/u', '', $token); - $replaced = preg_replace('/\d+/', '0', $replaced); - $replaced = strtolower(trim($replaced)); - $str .= empty($replaced) ? $token : $replaced; + $replaced = preg_replace('/\d+/', '0', $token); + $replaced = preg_replace('/\s+/', ' ', $token); + $replaced = preg_replace('/(.)\1{2,}/', '$1', $token); + $replaced = strtolower($replaced); + $str .= $replaced; } return $str; } @@ -279,11 +177,7 @@ class ChatLib { return $example[0]; } - private $start = []; - private $one = []; - private $two = []; - private $three = []; - private $four = []; - private $five = []; + private $size = 7; + private $transitions = []; }