|
| 1 | +<?php |
| 2 | + |
| 3 | +declare(strict_types=1); |
| 4 | + |
| 5 | +namespace Phpml\Tests\Tokenization; |
| 6 | + |
| 7 | +use Phpml\Exception\InvalidArgumentException; |
| 8 | +use Phpml\Tokenization\NGramTokenizer; |
| 9 | + |
| 10 | +/** |
| 11 | + * Inspiration: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html |
| 12 | + */ |
| 13 | +class NGramTokenizerTest extends TokenizerTest |
| 14 | +{ |
| 15 | + /** |
| 16 | + * @dataProvider textDataProvider |
| 17 | + */ |
| 18 | + public function testNGramTokenization(int $minGram, int $maxGram, string $text, array $tokens): void |
| 19 | + { |
| 20 | + $tokenizer = new NGramTokenizer($minGram, $maxGram); |
| 21 | + |
| 22 | + self::assertEquals($tokens, $tokenizer->tokenize($text)); |
| 23 | + } |
| 24 | + |
| 25 | + public function testMinGramGreaterThanMaxGramNotAllowed(): void |
| 26 | + { |
| 27 | + self::expectException(InvalidArgumentException::class); |
| 28 | + |
| 29 | + new NGramTokenizer(5, 2); |
| 30 | + } |
| 31 | + |
| 32 | + public function testMinGramValueTooSmall(): void |
| 33 | + { |
| 34 | + self::expectException(InvalidArgumentException::class); |
| 35 | + |
| 36 | + new NGramTokenizer(0, 2); |
| 37 | + } |
| 38 | + |
| 39 | + public function testMaxGramValueTooSmall(): void |
| 40 | + { |
| 41 | + self::expectException(InvalidArgumentException::class); |
| 42 | + |
| 43 | + new NGramTokenizer(1, 0); |
| 44 | + } |
| 45 | + |
| 46 | + public function textDataProvider(): array |
| 47 | + { |
| 48 | + return [ |
| 49 | + [ |
| 50 | + 1, 2, |
| 51 | + 'Quick Fox', |
| 52 | + ['Q', 'u', 'i', 'c', 'k', 'Qu', 'ui', 'ic', 'ck', 'F', 'o', 'x', 'Fo', 'ox'], |
| 53 | + ], |
| 54 | + [ |
| 55 | + 3, 3, |
| 56 | + 'Quick Foxes', |
| 57 | + ['Qui', 'uic', 'ick', 'Fox', 'oxe', 'xes'], |
| 58 | + ], |
| 59 | + [ |
| 60 | + 1, 2, |
| 61 | + '快狐跑过 边缘跑', |
| 62 | + ['快', '狐', '跑', '过', '快狐', '狐跑', '跑过', '边', '缘', '跑', '边缘', '缘跑'], |
| 63 | + ], |
| 64 | + [ |
| 65 | + 3, 3, |
| 66 | + '快狐跑过狐 边缘跑狐狐', |
| 67 | + ['快狐跑', '狐跑过', '跑过狐', '边缘跑', '缘跑狐', '跑狐狐'], |
| 68 | + ], |
| 69 | + [ |
| 70 | + 2, 4, |
| 71 | + $this->getSimpleText(), |
| 72 | + [ |
| 73 | + 'Lo', 'or', 're', 'em', 'Lor', 'ore', 'rem', 'Lore', 'orem', 'ip', 'ps', 'su', 'um', 'ips', 'psu', 'sum', 'ipsu', |
| 74 | + 'psum', 'do', 'ol', 'lo', 'or', 'dol', 'olo', 'lor', 'dolo', 'olor', 'si', 'it', 'sit', 'am', 'me', 'et', 'ame', |
| 75 | + 'met', 'amet', 'co', 'on', 'ns', 'se', 'ec', 'ct', 'te', 'et', 'tu', 'ur', 'con', 'ons', 'nse', 'sec', 'ect', 'cte', |
| 76 | + 'tet', 'etu', 'tur', 'cons', 'onse', 'nsec', 'sect', 'ecte', 'ctet', 'tetu', 'etur', 'ad', 'di', 'ip', 'pi', 'is', |
| 77 | + 'sc', 'ci', 'in', 'ng', 'adi', 'dip', 'ipi', 'pis', 'isc', 'sci', 'cin', 'ing', 'adip', 'dipi', 'ipis', 'pisc', |
| 78 | + 'isci', 'scin', 'cing', 'el', 'li', 'it', 'eli', 'lit', 'elit', 'Cr', 'ra', 'as', 'Cra', 'ras', 'Cras', 'co', 'on', |
| 79 | + 'ns', 'se', 'ec', 'ct', 'te', 'et', 'tu', 'ur', 'con', 'ons', 'nse', 'sec', 'ect', 'cte', 'tet', 'etu', 'tur', |
| 80 | + 'cons', 'onse', 'nsec', 'sect', 'ecte', 'ctet', 'tetu', 'etur', 'du', 'ui', 'dui', 'et', 'lo', 'ob', 'bo', 'or', |
| 81 | + 'rt', 'ti', 'is', 'lob', 'obo', 'bor', 'ort', 'rti', 'tis', 'lobo', 'obor', 'bort', 'orti', 'rtis', 'au', 'uc', |
| 82 | + 'ct', 'to', 'or', 'auc', 'uct', 'cto', 'tor', 'auct', 'ucto', 'ctor', 'Nu', 'ul', 'll', 'la', 'Nul', 'ull', 'lla', |
| 83 | + 'Null', 'ulla', 'vi', 'it', 'ta', 'ae', 'vit', 'ita', 'tae', 'vita', 'itae', 'co', 'on', 'ng', 'gu', 'ue', 'con', |
| 84 | + 'ong', 'ngu', 'gue', 'cong', 'ongu', 'ngue', 'lo', 'or', 're', 'em', 'lor', 'ore', 'rem', 'lore', 'orem', |
| 85 | + ], |
| 86 | + ], |
| 87 | + [ |
| 88 | + 2, 4, |
| 89 | + $this->getUtf8Text(), |
| 90 | + [ |
| 91 | + '鋍鞎', '鞮鞢', '鞢騉', '鞮鞢騉', '袟袘', '袘觕', '袟袘觕', '炟砏', '謺貙', '貙蹖', '謺貙蹖', '偢偣', '偣唲', |
| 92 | + '偢偣唲', '箷箯', '箯緷', '箷箯緷', '鑴鱱', '鱱爧', '鑴鱱爧', '覮轀', '剆坲', '煘煓', '煓瑐', '煘煓瑐', '鬐鶤', |
| 93 | + '鶤鶐', '鬐鶤鶐', '飹勫', '勫嫢', '飹勫嫢', '枲柊', '柊氠', '枲柊氠', '鍎鞚', '鞚韕', '鍎鞚韕', '焲犈', '殍涾', |
| 94 | + '涾烰', '殍涾烰', '齞齝', '齝囃', '齞齝囃', '蹅輶', '孻憵', '擙樲', '樲橚', '擙樲橚', '藒襓', '襓謥', '藒襓謥', |
| 95 | + '岯岪', '岪弨', '岯岪弨', '廞徲', '孻憵', '憵懥', '孻憵懥', '趡趛', '趛踠', '趡趛踠', |
| 96 | + ], |
| 97 | + ], |
| 98 | + ]; |
| 99 | + } |
| 100 | +} |
0 commit comments