2014-12-11 2 views
1

Я занят текстовым аналитическим проектом по массам данных жалоб. Одна из проблем с данными заключается в том, что вы получаете несколько синонимов одного и того же слова, например. счета, биллинга, счета, счета и т. д. Обычно я создавал список частот слов и вручную сопоставлял бы очевидные, а затем применял основное слово обратно к исходному корпусу для каждого экземпляра синонима, например. выставление счетов, выставление счетов, счетов -> счет (как и все связанные с векселями). У меня есть отличный фрагмент кода, с которым мне помог кто-то.R Матрица сходства строк

Недавно я играл с идеей использования алгоритма строкового расстояния, чтобы облегчить мою жизнь, идентифицируя возможные синонимы. Я использую пакет stringdist, но я не понимаю, как эффективно выполнить тест. В принципе мне нужна матрица всех слов, а на пересечении - результат функции stringdist.

Я использую функцию stringdist следующим образом:

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

Дает сходство 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

+0

Я сомневаюсь, что 'stringdist' векторизован, поэтому вы обречены на медленный цикл. Предполагая, что у вас есть слова 'n', и что вызов' n * (n-1)/2' функции слишком медленный, вам нужно будет проявить творческий подход, пытаясь уменьшить размер вашей проблемы. Например, работайте только над подгруппами слов, начинающимися с одной буквы. – flodel

+0

Если вы хотите использовать пакет 'stringdist', то почему бы не использовать' stringdistmatrix (...) '?? Кроме того, если вам комфортно с расстояниями Левенштейна, вы можете просто использовать 'adist (...)' в базе R. – jlhoward

ответ

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

Я предлагаю вам использовать стеммер, вы найдете его в пакете тм. Если требуется использовать измерение расстояния, вы можете использовать сходство с косинусом, а не Jaro-winkler.

Смежные вопросы