Я занят текстовым аналитическим проектом по массам данных жалоб. Одна из проблем с данными заключается в том, что вы получаете несколько синонимов одного и того же слова, например. счета, биллинга, счета, счета и т. д. Обычно я создавал список частот слов и вручную сопоставлял бы очевидные, а затем применял основное слово обратно к исходному корпусу для каждого экземпляра синонима, например. выставление счетов, выставление счетов, счетов -> счет (как и все связанные с векселями). У меня есть отличный фрагмент кода, с которым мне помог кто-то.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-кодер.
Приветствия
Можно ли заказать слова, а затем сделать таблицу пар с что элемент в столбце 2 не может быть меньше/меньше столбца 1? – user2627717
Я сомневаюсь, что 'stringdist' векторизован, поэтому вы обречены на медленный цикл. Предполагая, что у вас есть слова 'n', и что вызов' n * (n-1)/2' функции слишком медленный, вам нужно будет проявить творческий подход, пытаясь уменьшить размер вашей проблемы. Например, работайте только над подгруппами слов, начинающимися с одной буквы. – flodel
Если вы хотите использовать пакет 'stringdist', то почему бы не использовать' stringdistmatrix (...) '?? Кроме того, если вам комфортно с расстояниями Левенштейна, вы можете просто использовать 'adist (...)' в базе R. – jlhoward