2015-01-01 17 views
7

Tôi muốn sử dụng MetaPhone, Double Metaphone, Caverphone, MetaPhone3, SoundEx và nếu ai đó đã thực hiện nó NameX chức năng trong 'R' để tôi có thể phân loại và tóm tắt các giá trị để giảm thiểu hoạt động làm sạch dữ liệu trước khi phân tích.Chức năng MetaPhone (như SoundEx) và sử dụng trong R?

tôi hoàn toàn nhận thức được rằng mỗi thuật toán có những điểm mạnh và điểm yếu riêng của mình và cao không muốn sử dụng Soundex nhưng nó vẫn có thể làm việc nếu tôi không thể tìm thấy lựa chọn thay thế; giống như mentioned in this postHarper sẽ khớp với bất kỳ danh sách tên không có liên quan nào trong SoundEx nhưng không được đặt trong Metaphone để có kết quả phù hợp hơn.

Mặc dù tôi không chắc chắn sẽ phục vụ mục đích của mình tốt nhất trong khi vẫn duy trì tính linh hoạt, đó là lý do tôi muốn đâm một vài trong số đó cũng như trước khi xem xét các giá trị tạo bảng như sau.

enter image description here

Table Source Link

tên họ không phải là đối tượng của phân tích ban đầu của tôi, nhưng nghĩ rằng đó là một ví dụ điển hình như tôi muốn xem xét một cách hiệu quả tất cả như từ 'nghe' coi là cùng một giá trị thực sự là những gì Tôi đang cố gắng làm với một cái gì đó đơn giản gọi là giá trị được đánh giá.

Một số điều tôi đã xem xét:

  • Tôi biết rằng một gói C có thể được viết và được gọi với RCpp, và có được thậm chí các giải pháp C cho SoundEx on SE, nhưng tôi đã không viết một gói R trước và tìm cách tránh tái phát minh ra bánh xe nếu có cách đơn giản hơn để thực hiện nó trực tiếp trong R hoặc gói tồn tại có chức năng có sẵn không?
  • Tôi biết rằng gói RecordLinkage và bây giờ stringdist có chức năng SoundEx, nhưng không phải là bất kỳ hình thức nào của chức năng MetaPhone.

Vì vậy, tôi đặc biệt tìm kiếm một câu trả lời là làm thế nào để một MetaPhone/Caverphone hàm trong R và biết "Giá trị" vì vậy tôi có thể giá trị dữ liệu nhóm của họ?

Thông báo trước nữa là tôi vẫn coi bản thân mình khá mới đối với R vì tôi không phải là người dùng hàng ngày của nó.

Trả lời

9

Thuật toán khá đơn giản nhưng tôi cũng không thể tìm thấy gói R hiện có. Nếu bạn thực sự cần phải làm công việc này trong R, một lựa chọn ngắn hạn là cài đặt các module python metaphone (pip install metaphone) sau đó sử dụng cây cầu rPython sử dụng nó trong R:

library(rPython) 

python.exec("from metaphone import doublemetaphone") 
python.call("doublemetaphone", "architect") 
[1] "ARKTKT" "" 

Nó không phải là giải pháp thanh lịch nhất , nhưng nó giúp bạn hoạt động metaphone trong R.

Apache Commons có codec library đó cũng thực hiện các thuật toán 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" 

Bạn có thể làm cho trên .jcall một chức năng R và sử dụng nó như bất kỳ chức năng R khác:

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

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

## abridgement stupendous 
##  "ABRJ"  "STPN" 

Các giao diện java có thể tương thích hơn trên các nền tảng.

Dưới đây là một cái nhìn đầy đủ hơn về sử dụng giao diện 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 
8

Hiện nay có một thực hiện đúp Metaphone trong R trong gói 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" 
+1

FABULOUS! Trong thử nghiệm giới hạn của tôi, nó hoạt động rất tốt. – user2635373

0

Đây là một giải thích caverphone, trong khi nó nắm bắt được cách tiếp cận quy tắc tầng, hãy ghi nhớ rằng caverphone luôn dự định như là một ví dụ về tùy biến với một bối cảnh khu vực trọng âm (mặc dù người ta sử dụng nó trong một mục đích chung loại theo cách mà nó tạo ra một bộ cân bằng khác cho hầu hết những người khác dựa trên khu vực của họ), vì vậy tôi sẽ đề nghị a) lấy các ký tự duy nhất trong nguồn dữ liệu của bạn để đảm bảo bạn đang xử lý tất cả, b) xem xét thay đổi giới hạn độ dài cuối cùng liên quan đến tên bạn đang làm việc, và c) có suy nghĩ về mô hình kết hợp giọng khu vực - đây là mô hình hóa các nhóm giọng khác nhau ở New Zealand vào cuối những năm 1800/đầu những năm 1900 và cách chúng có thể sai -trả lời những gì người khác đang nói.

caverphonise <- function(x) { 
# Convert to lowercase 
x <- tolower(x) 

# Remove anything not A-Z 
x <- gsub("[^a-z]", "", x) 

# If the name starts with 
## cough make it cou2f 
x <- gsub("^cough", "cou2f", x) 
## rough make it rou2f 
x <- gsub("^rough", "rou2f", x) 
## tough make it tou2f 
x <- gsub("^tough", "tou2f", x) 
## enough make it enou2f 
x <- gsub("^enough", "enou2f", x) 
## gn make it 2n 
x <- gsub("^gn", "2n", x) 

# If the name ends with 
## mb make it m2 
x <- gsub("mb$", "m2", x) 

# Replace 
## cq with 2q 
x <- gsub("cq", "2q", x) 
## ci with si 
x <- gsub("ci", "si", x) 
## ce with se 
x <- gsub("ce", "se", x) 
## cy with sy 
x <- gsub("cy", "sy", x) 
## tch with 2ch 
x <- gsub("tch", "2ch", x) 
## c with k 
x <- gsub("c", "k", x) 
## q with k 
x <- gsub("q", "k", x) 
## x with k 
x <- gsub("x", "k", x) 
## v with f 
x <- gsub("v", "f", x) 
## dg with 2g 
x <- gsub("dg", "2g", x) 
## tio with sio 
x <- gsub("tio", "sio", x) 
## tia with sia 
x <- gsub("tia", "sia", x) 
## d with t 
x <- gsub("d", "t", x) 
## ph with fh 
x <- gsub("ph", "fh", x) 
## b with p 
x <- gsub("b", "p", x) 
## sh with s2 
x <- gsub("sh", "s2", x) 
## z with s 
x <- gsub("z", "s", x) 
## any initial vowel with an A 
x <- gsub("^[aeiou]", "A", x) 
## all other vowels with a 3 
x <- gsub("[aeiou]", "3", x) 
## 3gh3 with 3kh3 
x <- gsub("3gh3", "3kh3", x) 
## gh with 22 
x <- gsub("gh", "22", x) 
## g with k 
x <- gsub("g", "k", x) 
## groups of the letter s with a S 
x <- gsub("s+", "S", x) 
## groups of the letter t with a T 
x <- gsub("t+", "T", x) 
## groups of the letter p with a P 
x <- gsub("p+", "P", x) 
## groups of the letter k with a K 
x <- gsub("k+", "K", x) 
## groups of the letter f with a F 
x <- gsub("f+", "F", x) 
## groups of the letter m with a M 
x <- gsub("m+", "M", x) 
## groups of the letter n with a N 
x <- gsub("n+", "N", x) 
## w3 with W3 
x <- gsub("w3", "W3", x) 
## wy with Wy 
x <- gsub("wy", "Wy", x) 
## wh3 with Wh3 
x <- gsub("wh3", "Wh3", x) 
## why with Why 
x <- gsub("why", "Why", x) 
## w with 2 
x <- gsub("w", "2", x) 
## any initial h with an A 
x <- gsub("^h", "A", x) 
## all other occurrences of h with a 2 
x <- gsub("h", "2", x) 
## r3 with R3 
x <- gsub("r3", "R3", x) 
## ry with Ry 
x <- gsub("ry", "Ry", x) 
## r with 2 
x <- gsub("r", "2", x) 
## l3 with L3 
x <- gsub("l3", "L3", x) 
## ly with Ly 
x <- gsub("ly", "Ly", x) 
## l with 2 
x <- gsub("l", "2", x) 
## j with y 
x <- gsub("j", "y", x) 
## y3 with Y3 
x <- gsub("y3", "Y3", x) 
## y with 2 
x <- gsub("y", "2", x) 

# remove all 
## 2s 
x <- gsub("2", "", x) 
## 3s 
x <- gsub("3", "", x) 
# put six 1s on the end 
x <- paste(x,"111111", sep="") 
# take the first six characters as the code 
unlist(lapply(x, FUN= function(x){paste((strsplit(x, "")[[1]])[1:6], collapse="")})) 
} 
1

Tôi đã được làm việc trên một gói cho điều này, được gọi là âm học, for a few months. Tôi đã thực hiện một số điểm chung và ít phổ biến hơn, bao gồm Caverphone, Caverphone2, Metaphone và soundex. Một số khác được thực hiện. Tôi vẫn còn một số ít hơn tôi dự định thực hiện trước khi gọi nó 1.0, nhưng tôi vừa gửi một bản phát hành của gói cho CRAN.

Các vấn đề liên quan