2014-12-11 99 views
1

我忙於處理大量投訴數據的文本分析項目。數據的一個問題是你得到同一單詞的多個同義詞,例如,賬單,計費,賬單,賬單等。通常我會創建一個詞頻列表並手動匹配顯而易見的詞,然後將主詞應用回原始語料庫以用於每個同義詞實例,例如,賬單,賬單,賬單 - >賬單(因爲它是所有賬單相關的)。我有一個漂亮的代碼,有人在這裏幫助我。R字符串相似度矩陣

最近我一直在玩弄使用字符串距離算法的想法,通過識別可能的同義詞來使我的生活更輕鬆。我正在使用stringdist軟件包,但如何高效地實施測試,我感到很茫然。基本上我需要一個所有單詞的矩陣,並在交叉點處使用stringdist函數的結果。

我使用stringdist功能如下:

library(stringdist) 
1 - stringdist('MARTHA','MATHRA',method='jw',p=0.1) 

給出了A,B,C的單詞列表的0.955

那麼的相似性得分,我想要去(值僅供參考):

a b c 
a 1 0.4 0.4 
b 0.4 1 0.4 
c 0.4 0.4 1 

其中交叉點是stringdist函數的結果。

備選地我也可以工作以:

a a 1 
a b 0.4 
a c 0.4 
b a 0.4 
b b 1 
b c 0.4 
c a 0.4 
c b 0.4 
c c 1 

與後者的唯一問題是重複的,例如a,b和b,a可以被消除,因爲它會產生相同的結果。

所以聰明的R編碼器,請幫助我。我想答案在矩陣函數中,但我不是一個好的R編碼器。

乾杯

+0

是否有可能訂購的話,然後進行與對您的表規定第2列中的項目不能小於/低於第1列? – user2627717 2014-12-11 03:24:35

+0

我懷疑'stringdist'是矢量化的,所以你註定要慢速循環。假設你有'n'個詞,並且對該函數調用'n *(n-1)/ 2'的速度太慢,那麼在嘗試減小問題大小時你必須有創意。例如,只能處理以相同字母開頭的子組的單詞。 – flodel 2014-12-11 03:35:17

+0

如果你想使用package'stringdist'那麼爲什麼不使用'stringdistmatrix(...)'?另外,如果您對Levenshtein距離感到滿意,則可以在基數R中使用'adist(...)'。 – jlhoward 2014-12-11 04:17:45

回答

1

以便移除重複如上所述:

dist.mat.tab.sort <- t(apply(dist.mat.tab, 1, sort)) 
dist.mat.tab <- dist.mat.tab[!duplicated(dist.mat.tab.sort),] 

凡dist.mat.tab是熔融的距離矩陣

1

我建議你使用stemmer,你會發現它在tm包。如果需要使用距離測量,則可以使用餘弦相似度而不是Jaro-winkler。