Есть ли лучший способ классификации повествования на основе ключевых слов в R? - PullRequest
0 голосов
/ 14 апреля 2020

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

#a is the narration and b(s) are some keywords
a = "PRAJA GHUPTA UTAMA Trf Inw RTGS PT BANK NEGARA INDONESIA (PERSERO) TBKPRAJA GHUPTA UTAMA"
b1 = "tarik"
b2 = "pajak"
b3 = "trf inw rtgs"

#After loading stringdist library
dis1 = stringdist(tolower(a),b1,method = "jw") 
dis2 = stringdist(tolower(a),b2,method = "jw")
dis3 = stringdist(tolower(a),b3,method = "jw")

#Output 
> dis1
[1] 0.3810606

> dis2
[1] 0.3143939

> dis3
[1] 0.4406566

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

Что я не понимаю, так это то, что b3 является подстрокой повествования a, но при этом не имеет расстояния в шкафу по сравнению с другими ключевыми словами.

Хотел бы узнать, есть ли за этим какая-то причина и какой другой альтернативный подход я могу попробовать для лучшего соответствия?

1 Ответ

0 голосов
/ 14 апреля 2020

Здесь необходимо отметить, что stringdist() относится к символам, в то время как вопрос, похоже, хочет найти сходство слов. Поэтому рассмотрим следующее:

# Note this does not attempt to explain all nuances, but only the word versus character aspect:
a = "PRAJA GHUPTA UTAMA Trf Inw RTGS PT BANK NEGARA INDONESIA (PERSERO) TBKPRAJA GHUPTA UTAMA"
b1 = "tarik"      
b2 = "pajak"
b3 = "trf inw rtgs"
b4 = "PRAJA GHUPTA"   # exactly same char. seq. but nchar = 11 - higher score     
b5 = "PRAJA G"        # exactly same char. seq. but nchar = 6  - lower score
b6 = "PRAJA G"        # same, stringdist(b5,b6,method = "jw") = 0 as expected
b7 = "paa gua uaa"    # dis7 = stringdist(tolower(a),b7,method = "jw")
library(stringdist)
library(stringi)
library(stringr)
#After loading stringdist library
dis1 = stringdist(tolower(a),b1,method = "jw") 
dis2 = stringdist(tolower(a),b2,method = "jw")
dis3 = stringdist(tolower(a),b3,method = "jw")
dis4 = stringdist(tolower(a),b4,method = "jw")
dis5 = stringdist(tolower(a),b5,method = "jw")
dis6 = stringdist(b5,b6,method = "jw")

# This uses b7, where b7 nchar=9, but only 4 unique chars p,a,g & u - all available early
dis7 = stringdist(tolower(a),b7,method = "jw")   # relatively 2nd lowest score : 0.2916667


dis1;dis2;dis3;dis4;dis5; dis6; dis7

> dis1;dis2;dis3;dis4;dis5; dis6; dis7
[1] 0.3810606
[1] 0.3143939
[1] 0.4406566
[1] 0.635101
[1] 0.6152597
[1] 0
[1] 0.2916667

# other aspects are explained in the vignette /help pages
...