MetaPhone功能(如SoundEx)功能并在R中使用?

CRS*_*ser 7 soundex r metaphone

我想使用MetaPhone,Double Metaphone,Caverphone,MetaPhone3,SoundEx,如果有人在'R'中完成了NameX功能,那么我可以对数值进行分类和汇总,以便在分析之前最大限度地减少数据清理操作.

我充分意识到每种算法都有自己的优点和缺点,并且非常希望不使用SoundEx,但如果我找不到替代品,它仍然可以工作; 正如在这篇文章中提到的那样, Harper将与SoundEx下的任何不相关名称列表匹配,但不应该在Metaphone中以获得更好的结果匹配.

虽然我不确定哪个会最好地服务于我的目的,同时仍然保留一些灵活性,所以这就是我想要对它们中的几个进行刺穿以及在查看值之前生成如下表格的原因.

在此输入图像描述

表源链接

姓氏不是我初步分析的主题,但认为这是一个很好的例子,因为我想有效地考虑所有像'听起来'的单词被视为相同的值真的是我试图用简单地调用的东西作为值被评估.

我已经看过的一些事情:

  • 我知道可以使用RCpp编写和调用C包,并且在SE上甚至有针对SoundEx的 C解决方案,但我之前没有编写R包并且希望避免重新发明轮子,如果有更简单的方法直接在R中执行,还是存在具有该功能的包?
  • 我知道RecordLinkage和现在的stringdist包具有SoundEx功能,但不具有任何形式的MetaPhone功能.

所以我特意寻找答案是如何在R中运行MetaPhone/Caverphone并知道"值",以便我可以按它们对数据值进行分组?

另外需要注意的是,我仍然认为自己是R的新手,因为我不是每天的用户.

hrb*_*str 9

该算法非常简单,但我也找不到现有的R包.如果你真的需要在R中做这个工作,一个短期的选择是安装python模块metaphone(pip install metaphone)然后使用rPython桥在R中使用它:

library(rPython)

python.exec("from metaphone import doublemetaphone")
python.call("doublemetaphone", "architect")
[1] "ARKTKT" ""
Run Code Online (Sandbox Code Playgroud)

它不是最优雅的解决方案,但它可以让你在R中进行metaphone操作.

Apache Commons有一个编解码器库,它也实现了metaphone算法:

library(rJava)

.jinit() # need to have commons-codec-1.10.jar in your CLASSPATH

mp <- .jnew("org.apache.commons.codec.language.Metaphone")
.jcall(mp,"S","metaphone", "architect")
[1] "ARXT"
Run Code Online (Sandbox Code Playgroud)

你可以使上面.jcall的R函数和其他任何R函数一样使用它:

metaphone <- function(x) {
  .jcall(mp,"S","metaphone", x)  
}

sapply(c("abridgement", "stupendous"), metaphone)

## abridgement  stupendous 
##      "ABRJ"      "STPN"
Run Code Online (Sandbox Code Playgroud)

java接口也可以跨平台更兼容.

这是使用java界面的更完整视图:

library(rJava)

.jinit()

mp <- .jnew("org.apache.commons.codec.language.Metaphone")
dmp <- .jnew("org.apache.commons.codec.language.DoubleMetaphone")

metaphone <- function(x) {
  .jcall(mp,"S","metaphone", x)  
}

double_metaphone <- function(x) {
  .jcall(dmp,"S","doubleMetaphone", x)  
}

words <- c('Catherine', 'Katherine', 'Katarina', 'Johnathan', 
           'Jonathan', 'John', 'Teresa', 'Theresa', 'Smith', 
           'Smyth', 'Jessica', 'Joshua')

data.frame(metaphone=sapply(words, metaphone),
           double=sapply(words, double_metaphone))

##           metaphone double
## Catherine      K0RN   K0RN
## Katherine      K0RN   K0RN
## Katarina       KTRN   KTRN
## Johnathan      JN0N   JN0N
## Jonathan       JN0N   JN0N
## John             JN     JN
## Teresa          TRS    TRS
## Theresa         0RS    0RS
## Smith           SM0    SM0
## Smyth           SM0    SM0
## Jessica         JSK    JSK
## Joshua           JX     JX
Run Code Online (Sandbox Code Playgroud)


Cro*_*ops 8

现在R包中有Double Metaphone的实现PGRdup.

install.packages(PGRdup)
library(PGRdup)
words <- c('Catherine', 'Katherine', 'Katarina', 'Johnathan', 
           'Jonathan', 'John', 'Teresa', 'Theresa', 'Smith', 
           'Smyth', 'Jessica', 'Joshua')
DoubleMetaphone(words)

$primary
 [1] "K0RN" "K0RN" "KTRN" "JN0N" "JN0N" "JN"   "TRS"  "0RS"  "SM0"  "SM0"  "JSK"  "JX"  

$alternate
 [1] "KTRN" "KTRN" "KTRN" "ANTN" "ANTN" "AN"   "TRS"  "TRS"  "XMT"  "XMT"  "ASK"  "AX"  
Run Code Online (Sandbox Code Playgroud)