使用tm
和slam
包,这是一个不太幼稚的做法,采用了文本处理技术:
## load the requisite libraries
library(tm)
library(slam)
首先,从组合的城镇创建语料库和水载体。我们最终将根据文本计算每个城镇和每个水体之间的距离。
corpus <- Corpus(VectorSource((c(towns, water))))
在这里,我做一些标准的预处理,通过删除标点符号和“文件”。词干找出词的共同基础部分。例如,城市和城市具有相同的词干:城市和城市具有相同的词干:城市和城市具有相同的词干:城市和城市具有相同的词干:城市和城市具有相同的词干:标准的术语文档矩阵具有二进制指示符,其中文字在哪个文档中。我们想编码关于这个词在整个语料库中的频繁程度的附加信息。例如,我们不在乎“the”出现在文档中的频率,因为它非常常见。
tdm <- weightTfIdf(TermDocumentMatrix(corpus))
最后,我们计算每个文档之间的余弦距离。 tm
包创建通常非常有效的稀疏矩阵。 slam
包具有稀疏矩阵的矩阵数学函数。
cosine_dist <- function(tdm) {
crossprod_simple_triplet_matrix(tdm)/(sqrt(col_sums(tdm^2) %*% t(col_sums(tdm^2))))
}
d <- cosine_dist(tdm)
> d
Docs
Docs 1 2 3 4 5 6 7 8
1 1.00000000 0.034622992 0.038063800 0.044272011 0.00000000 0.0000000 0.000000000 0.260626250
2 0.03462299 1.000000000 0.055616255 0.064687275 0.01751883 0.0000000 0.146145917 0.006994714
3 0.03806380 0.055616255 1.000000000 0.071115850 0.01925984 0.0000000 0.006633427 0.007689843
4 0.04427201 0.064687275 0.071115850 1.000000000 0.54258275 0.0000000 0.007715340 0.008944058
5 0.00000000 0.017518827 0.019259836 0.542582752 1.00000000 0.0000000 0.014219656 0.016484228
6 0.00000000 0.000000000 0.000000000 0.000000000 0.00000000 1.0000000 0.121137618 0.000000000
7 0.00000000 0.146145917 0.006633427 0.007715340 0.01421966 0.1211376 1.000000000 0.005677459
8 0.26062625 0.006994714 0.007689843 0.008944058 0.01648423 0.0000000 0.005677459 1.000000000
现在我们在同一个矩阵中的所有城镇和水体之间有一个相似度分数矩阵。不过,我们只关心这个矩阵的一半距离。因此,在下面的应用函数索引符号:
best.match <- apply(d[5:8,1:4], 1, function(row) if(all(row == 0)) NA else which.max(row))
而这里的输出:
> cbind(water, towns[best.match])
water
[1,] "Alturas City of" "Alturas city, Modoc County"
[2,] "Casitas Municipal Water District" NA
[3,] "California Water Service Company Bellflower City" "Bellflower city, Los Angeles County"
[4,] "Contra Costa City of Public Works" "Acalanes Ridge CDP, Contra Costa County"
通知NA值。当一个水体和所有城镇之间没有一个单词匹配时,NA被返回。
如果你有一个列表与所有城市apriori然后这变得很容易解决。我认为最好尽量避免部分匹配 – Sotos
不幸的是,我没有那个。如果我打算列出这份清单,那么只需穿过400个水区,并手工将它们与1500个城镇中的任何一个匹配就可能更容易。 –