bdp-raymon / rhyme-suggester
基于音韵的押韵建议器,使用编辑距离算法
Requires
- php: ^7.4|^8.0
- shamir0xe/php-library: ^0.1.4
Requires (Dev)
- phpunit/phpunit: ^9.3
README
押韵建议器 PHP 包
此包帮助您使用编辑距离算法找到与目标对象最接近的对象,具体应用于单词的音韵。换句话说,此包将根据发音建议数据库中最接近的元素。
安装
要安装此包,您只需要通过 composer 在项目的根目录中要求它
composer require bdp-raymon/rhyme-suggester
基本用法
为了熟悉包,我们在 samples
目录中提供了一个小型数据库。您只需运行下面的代码来查看与 امیر
相关的韵律词
use BdpRaymon\RhymeSuggester\Rhyme; use BdpRaymon\RhymeSuggester\Samples\Database as SampleDatabase; use BdpRaymon\RhymeSuggester\PhpLibrary\Arr; // this will return the array containing the nearest objects to the `امیر` $list = Rhyme::db(SampleDatabase::_)->filter(); $output = Arr::get($list, fn($value) => $value[0]['name']); print_r($output);
生成的输出应类似于以下内容
[ "امیر", "عمید", "امین", "عزیز", "عقیل", "عقیق", "ادیب", "عفیف", "علیم", "اوین" ]
完整用法
填充数据库
您可以通过两种不同的方式将数据库喂给包。第一种方法已在上面的示例中展示,即通过将数组注入到静态的 Rhyme::db
函数中。其次,您可以提供自己的数据集的 .csv
文件并将其作为参数使用
Rhyme::db("PATH-TO-THE-CSV-FILE.csv");
配置
示例配置文件位于 samples/Config.php
文件中。应配置文件中使用的字段如下
- searchKey: (必需) 这是包用于将查询搜索到数据库以查找查询对象的键。例如,在我们的数据库中,我们使用 name 键
- phoneticKey: (必需) 我们在它上使用编辑距离算法的数据库中的键。通常它应该是 phonetic 字段。
- 元音: (必需) 在这里以单个字符串指定您语言字母表中的元音。
- 押韵距离: (必需) 这是音韵算法中不重要的字符之间的距离。我们将在稍后讨论它。
配置文件需要在创建 Rhyme
类的对象之后设置,以下结构
$config = [ 'searchKey' => 'name', 'phoneticKey' => 'phonetic', 'vowels' => 'aeiouā', 'rhymeDistance' => 0.1, ]; Rhyme::db($db)->setConfig($config);
运行查询和过滤
指定数据库和配置后,您可以使用 filter
函数运行查询。此函数允许您自定义搜索查询。允许在过滤数组中的字段如下
-
配置搜索键 上一步中配置为配置的搜索键。在我们的示例中,我们使用 name 键作为 searchKey。
-
押韵: (必需) 押韵字段接受两个值
- RhymeTypes::VOWEL
- RhymeTypes::CONSONENT
这两个字段允许您指定建议的名称。特别是,它表示在编辑距离算法中哪些字符的音韵权重小于其他字符。如果您选择 VOEWEL,则辅音字符将具有之前阶段提供的 rhymeDistance 权重,而元音字符的值等于 1。反之亦然。
-
选择: (可选) 此部分的接受值如下
- SelectionTypes::FIRST
- SelectionTypes::LAST
- SelectionTypes::BOTH
- SelectionTypes::NO
这些值指定在算法中应使用哪些音韵的音节。FIRST 表示应使用第一个音节,依此类推。
-
相似度: (可选) 相似度部分力荐名称应与使用此属性指定的部分完全相同。它接受以下值
- SimilarityTypes::FIRST
- SimilarityTypes::LAST
- SimilarityTypes::NO
-
省略重复: (可选) 如果设置为false,它将在音节中删除连续的两个辅音之一。例如,它将abbās变为abās。
-
包含: (可选) 如果设置为true,它将推荐包含查询名称或包含查询名称的单词。
-
显示距离: (可选) 如果设置为true,它将在返回数组中显示找到的单词的距离。
-
计数: (可选) 您可以使用此选项指定您想要接收的单词数量。默认为-1,表示将返回所有找到的实例。
示例
完整的示例应类似于以下内容
use BdpRaymon\RhymeSuggester\Rhyme; use BdpRaymon\RhymeSuggester\Types\RhymeTypes; use BdpRaymon\RhymeSuggester\Types\SelectionTypes; use BdpRaymon\RhymeSuggester\Types\SimilarityTypes; use BdpRaymon\RhymeSuggester\PhpLibrary\Arr; $dbPath = __DIR__ . "/vendor/bdp-raymon/rhyme-suggester/samples/output_phonetic.csv"; $config = [ 'searchKey' => 'name', 'phoneticKey' => 'phonetic', 'vowels' => 'aeiouā', 'rhymeDistance' => 0.1, ]; $filter = [ 'name' => 'مهدی', 'rhyme' => RhymeTypes::VOWEL, 'selection' => SelectionTypes::NO, 'similarity' => SimilarityTypes::FIRST, 'tashdid' => false, 'included' => true, 'showDistance' => true, 'count' => 15, ]; $list = Rhyme::db($dbPath)->setConfig($config)->filter($filter); $output = Arr::get($list, fn($value) => $value[0]['name']); print_r($output);
输出应如下所示
[ "مهدی", "امیر مهدی", "مهدیس", "امیرمهدی", "اوتانا", "مهدیسا", "هستی", "فخری", "نرسی", "سلمی", "بدری", "زردیس", "تقی", "پردیس", "پری", ]
测试
要运行测试,请使用以下composer命令
composer test