bdp-raymon/rhyme-suggester

基于音韵的押韵建议器,使用编辑距离算法

v0.1.5 2021-02-28 09:09 UTC

This package is auto-updated.

Last update: 2024-09-28 17:12:44 UTC


README

押韵建议器 PHP 包

Total Downloads

此包帮助您使用编辑距离算法找到与目标对象最接近的对象,具体应用于单词的音韵。换句话说,此包将根据发音建议数据库中最接近的元素。

安装

要安装此包,您只需要通过 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

鸣谢