PHP 日本研討會 2024

metaphone

(PHP 4、PHP 5、PHP 7、PHP 8)

metaphone計算字串的 metaphone 索引鍵

描述

metaphone(字串 $string, 整數 $max_phonemes = 0): 字串

計算 string 的 metaphone 索引鍵。

類似於 soundex(),metaphone 為發音相似的單字建立相同的索引鍵。它比 soundex() 更準確,因為它知道英文發音的基本規則。產生的 metaphone 索引鍵長度可變。

Metaphone 由 Lawrence Philips <lphilips at verity dot com> 開發。它在 ["Practical Algorithms for Programmers", Binstock & Rex, Addison Wesley, 1995] 中有描述。

參數

string

輸入字串。

max_phonemes

此參數將傳回的 metaphone 索引鍵限制為 max_phonemes字元長度。但是,產生的音素總是完整轉錄,因此產生的字串長度可能會略長於 max_phonemes。預設值 0 表示沒有限制。

傳回值

傳回 metaphone 索引鍵作為字串。

變更紀錄

版本 描述
8.0.0 函式在失敗時傳回 false

範例

範例 1 metaphone() 基本範例

<?php
var_dump
(metaphone('programming'));
var_dump(metaphone('programmer'));
?>

上述範例將輸出

string(7) "PRKRMNK"
string(6) "PRKRMR"

範例 2 使用 max_phonemes 參數

<?php
var_dump
(metaphone('programming', 5));
var_dump(metaphone('programmer', 5));
?>

上述範例將輸出

string(5) "PRKRM"
string(5) "PRKRM"

範例 3 使用 max_phonemes 參數

在此範例中,建議 metaphone() 產生一個五個字元的字串,但這需要拆分最終的音素('x' 應該轉錄為 'KS'),因此該函式會傳回一個有六個字元的字串。

<?php
var_dump
(metaphone('Asterix', 5));
?>

上述範例將輸出

string(6) "ASTRKS"

新增註解

使用者提供的註解 4 則註解

65
mail at spam-off dot iaindooley dot com
20 年前
您可以透過取得兩個 metaphone 代碼之間的 Levenshtein 距離,然後將其作為原始 metaphone 代碼長度的百分比,來非常有效地將 metaphone 函式與片語一起使用。因此,您可以定義一個百分比錯誤(例如 20%),並僅接受比該值更接近的匹配。我發現這在我網站上使用的一個函式中效果很好,該函式會根據可能相似的現有專輯名稱來驗證使用者輸入的專輯名稱。這也是一種很好的方法,讓使用者能夠模糊地記住一個片語,並從資料庫中獲得幾個建議。因此,您可以用錯誤百分比(例如 50)輸入「i stiched nine times」,仍然可以將「a stitch in time saves nine」作為匹配項傳回。
22
Vipindas K.S
16 年前
metaphone
=======================
metaphone() 函式可用於拼寫應用程式。此函式會在成功時傳回字串的 metaphone 索引鍵,失敗時傳回 FALSE。其主要用途是在您搜尋家譜資料庫時。檢查是否提供 metaphone 搜尋。它在建立/搜尋家譜時也很有用。
以下是一個簡單的程式碼,可計算和比較兩個字串,以找出其 metaphone 代碼是否相等。

html 程式碼
==========
<html>
<body>
<form action="test.php" name="test" method="get">
名稱 1:<input type="text" name="name1" /><br />
名稱 2:<input type="text" name="name2" /><br />
<input type="submit" name="submit" value="compare" />
</form>

<!--php 程式碼從這裡開始 -->

<?php
if(isset($_GET['submit']))
{
$str1 = $_GET['name1'];
$str2 = $_GET['name2'];
$meta_one=metaphone($str1);
$meta_two=metaphone($str2);
echo
"metaphone 程式碼 ".$str1." 是 ". $meta_one;
echo
"<br />";
echo
"metaphone 程式碼 ".$str2." 是 ". $meta_two."<br>";
if(
$meta_one==$meta_two)
{
echo
"metaphone 程式碼相符";
}
else
{
echo
"metaphone 程式碼不相符";
}
}
?>

</body>
</html>

Metaphone 演算法是由 Lawrence Philips 開發。

Lawrence Philips 的規則如下

16 個子音
|--- ZERO 代表 "th"
|
B X S K J T F H L M N P R 0 W Y

例外

字詞開頭:"ae-"、"gn"、"kn-"、"pn-"、"wr-" ----> 捨棄第一個字母
"Aebersold"、"Gnagy"、"Knuth"、"Pniewski"、"Wright"

字詞開頭:"x" ----> 變更為 "s"
如 "Deng Xiaopeng"

字詞開頭:"wh-" ----> 變更為 "w"
如 "Whalen"

轉換

B ----> B,除非在字詞末尾,且在 "m" 之後,如 "dumb"、"McComb"

C ----> X (sh),如果 "-cia-" 或 "-ch-"
S,如果 "-ci-"、"-ce-" 或 "-cy-"
靜音,如果 "-sci-"、"-sce-" 或 "-scy-"
否則為 K,包括 "-sch-"

D ----> J,如果 "-dge-"、"-dgy-" 或 "-dgi-"
否則為 T

F ----> F

G ----> 靜音,如果 "-gh-" 且不在結尾或母音之前
在 "-gn" 或 "-gned" 中
在 "-dge-" 等中,如上述規則
J,如果在 "i"、"e" 或 "y" 之前,如果不是雙 "gg"
否則為 K

H ----> 靜音,如果在母音之後且沒有母音跟隨
或在 "-ch-"、"-sh-"、"-ph-"、"-th-"、"-gh-" 之後
否則為 H

J ----> J

K ----> 靜音,如果在 "c" 之後
否則為 K

L ----> L

M ----> M

N ----> N

P ----> F,如果在 "h" 之前
否則為 P

Q ----> K

R ----> R

S ----> X (sh),若在 "h" 之前,或在 "-sio-" 或 "-sia-" 中
S 其他情況

T ----> X (sh),若在 "-tia-" 或 "-tio-" 中
0 (th),若在 "h" 之前
靜音,若在 "-tch-" 中
否則為 T

V ----> F

W ----> 靜音,若後面不是母音
W,若後面是母音

X ----> KS

Y ----> 靜音,若後面不是母音
Y,若後面是母音

Z ----> S
15
php at casadebender dot com
16 年前
有一個可用的雙重變音(double metaphone) pecl 模組:http://pecl.php.net/package/doublemetaphone
9
Ray.Paseur often uses Gmail
11 年前
Metaphone() 顯然會忽略非英文字元。比較 Plaçe TO Place 會產生 "PL" 和 "PLS"。 soundex() 也會產生類似的結果。
To Top