Создание слова из букв

Я пытаюсь создать DFM букв из строк. Я сталкиваюсь с проблемами, когда dfm не может выбрать, может создать функции для пунктуации, такие как "/" "-" "." или же '.

require(quanteda)
dict = c('a','b','c','d','e','f','/',".",'-',"'")
dict <- quanteda::dictionary(sapply(dict, list))

x<-c("cab","baa", "a/de-d/f","ad")
x<-sapply(x, function(x) strsplit(x,"")[[1]])
x<-sapply(x, function(x) paste(x, collapse = " "))

mat <- dfm(x, dictionary = dict, valuetype = "regex")
mat <- as.matrix(mat)
mat
  1. Для "a / de-d / f" я хочу захватить буквы "/" "-" тоже
  2. Почему это "." функция выступает в качестве строки. Как я могу сохранить это как индивидуальную особенность?

1 ответ

Решение

Проблема (как отмечает @lukeA в комментарии) состоит в том, что ваш valuetype использует неправильное соответствие шаблону. Вы используете регулярное выражение, где . обозначает любой символ, и, следовательно, здесь мы получаем общую сумму (то, что вы называете строкой).

Давайте сначала посмотрим на x, который будет помечен на пробел dfm(), так что каждый персонаж становится токеном.

x
#        cab               baa          a/de-d/f                ad 
#    "c a b"           "b a a" "a / d e - d / f"             "a d" 

Чтобы ответить (2) в первую очередь, вы получите следующее с регулярным выражением:

dfm(x, dictionary = dict, valuetype = "regex", verbose = FALSE)
## Document-feature matrix of: 4 documents, 10 features.
## 4 x 10 sparse Matrix of class "dfmSparse"
##           features
## docs       a b c d e f / . - '
##   cab      1 1 1 0 0 0 0 3 0 0
##   baa      2 1 0 0 0 0 0 3 0 0
##   a/de-d/f 1 0 0 2 1 1 0 5 0 0
##   ad       1 0 0 1 0 0 0 2 0 0

Это близко, но не отвечает (1). Чтобы решить эту проблему, вам нужно изменить поведение токенизации по умолчанию: dfm() так что это не удаляет пунктуацию.

dfm(x, dictionary = dict, valuetype = "fixed", removePunct = FALSE, verbose = FALSE)
## Document-feature matrix of: 4 documents, 10 features.
## 4 x 10 sparse Matrix of class "dfmSparse"
##           features
## docs       a b c d e f / . - '
##   cab      1 1 1 0 0 0 0 0 0 0
##   baa      2 1 0 0 0 0 0 0 0 0
##   a/de-d/f 1 0 0 2 1 1 2 0 1 0
##   ad       1 0 0 1 0 0 0 0 0 0

а теперь / а также - подсчитываются. . а также ' остаются присутствующими как функции, потому что они были ключами словаря, но имеют нулевой счет для каждого документа.

Другие вопросы по тегам