интеллектуальный анализ текста с помощью библиотеки r stringdist

У меня есть следующий алгоритм, подготовленный для сопоставления двух строк.

library(stringdist)

qgrams('perimetrico','perimetrico peri',q=2)

   pe ri tr er im me o  et ic co  p
V1  1  2  1  1  1  1  0  1  1  1  0
V2  2  3  1  2  1  1  1  1  1  1  1

Насколько я понимаю, это формальная реализация для подсчета количества вхождений.

stringdist('perimetrico','perimetrico peri', method='qgram', q=2)

5

Но меня такое решение не устраивает. Вот почему я хочу подсчитать первый результат, например, следующим образом:

pe=1
ri=1
tr=1
er=1
im=1
me=1
o=0
et=1
ic=1
co=1
p=0

Таким образом, окончательный результат будет 9/11 = 82% совпадения.


person lolo    schedule 07.09.2017    source источник


Ответы (1)


Используйте применить (для каждой строки), чтобы подсчитать, сколько вхождений равно 0, и вычесть это число из 1.

library(stringdist)
foo <- qgrams('perimetrico','perimetrico peri',q=2)
apply(foo, 1, function(x) 1 - mean(x == 0))

       V1        V2 
0.8181818 1.0000000 

Или вы можете округлить (для 0.82) и умножить на 100 (для 82 процентов)

apply(a, 1, function(x) round(1 - mean(x == 0), 2) * 100)

 V1  V2 
 82 100 
person pogibas    schedule 07.09.2017
comment
Не могли бы вы использовать mean(x > 0) в своей функции? - person CPak; 08.09.2017
comment
@CPak да, это сработает, но я мало что знаю о данных OP. Что, если где-то есть -1. - person pogibas; 08.09.2017
comment
@PoGibas, точка принята, но я не понимаю, почему -1 может появиться в выводе qgrams - person CPak; 08.09.2017
comment
Нет, вклад был сделан для @PoGibas. Извините, если я оговорился. - person lolo; 08.09.2017
comment
Без иронии, код apply(foo, 1, function(x) 1 - mean(x == 0)) помогает в процессе, который я разрабатываю - person lolo; 08.09.2017