2017-02-04 5 views
1

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

Это то, что я использую (часть кода от this:

library("data.table","qdap","sets", "lsa") 

s <- c("employees businesses san gwann admitted sales taken hit after traffic diversions implemented without notice vjal ir - rihan over weekend.", 
"also complained werent consulted diversion blocked vehicles driving centre  san gwann via roundabout forks san gwann industrial estate, church forced motorists take detour around block instead.", 
"barriers erected roundabout exit, after youtube video cars disregarding signage passing through roundabout regardless went viral.", 
"planned temporary diversion, brace san gwann influx cars set pass through during works kappara junction project.", 
"usually really busy weekend, our sales lower round, corner store worker maria abela admitted maltatoday.") 

c <- "tm dont break whats broken. only queues developing, pass here every morning never experienced such mess notwithstanding tm officials directing traffic. hope report congestion happening area. lc tm tried pro - active hope admit recent traffic changes working." 


calculateCosine <- function(setX, setY){ 
require(qdap) 
y <- c(unlist(as.character(tolower(setY)))) 
x <- c(unlist(strsplit(as.character(tolower(setX)), split = ", "))) 
diffLength <- length(y) - length(x) 
x <- bag_o_words(x) 
for(pad in 1 : diffLength){ 
    x <- c(x, "") 
    } 
    # write both sets to temp files and calculate cosine similarity 
    write(y, file=paste(td, "Dy", sep="/")) 
    write(x, file=paste(td, "Dx", sep="/")) 
    myMatrix = textmatrix(td, stopwords=stopwords_en, minWordLength = 3) 
    similCosine <- as.numeric(round(cosine(myMatrix[,1], myMatrix[,2]), 3)) 
    return(similCosine) 
} 

n <- 3 
max <- length(s)%/%n 
x <- seq_along(s) 
d1 <- split(s, ceiling(x/max)) 
res <- c() 
for(i in 1 : length(d1)){ 
    val <- calculateCosine(as.set(paste(d1[i], sep = " ", collapse = " ")), as.set(c)) 
    res <- c(res, val) 
} 

Ради опрятность, было бы возможно изменить цикл в одну из функций, применять какие-либо идеи или комментарии будут? высоко оценили спасибо

+0

Edited. Спасибо что подметил это. – salvu

ответ

4

Рассмотрим настройки двух for петли с rep и sapply:..

Внутри calculateCosine

# ORIGINAL CODE 
x <- bag_o_words(x) 
for(pad in 1 : diffLength){ 
    x <- c(x, "") 
    } 

# ADJUSTED CODE 
x <- bag_o_words(x) 
x <- c(x, rep("", diffLength))  

# OR ONE LINE 
x <- c(bag_o_words(x), rep("", diffLength)) 

Вне calculateCosine(изменение в lapply если вам требуется возвращенного список вместо вектора/матрицы)

# ORIGINAL CODE 
res <- c() 
for(i in 1 : length(d1)){ 
    val <- calculateCosine(as.set(paste(d1[i], sep = " ", collapse = " ")), as.set(c)) 
    res <- c(res, val) 
} 

# ADJUSTED CODE 
res <- sapply(d1, function(i) { 
    calculateCosine(as.set(paste(i, sep = " ", collapse = " ")), as.set(c)) 
}) 
+0

Большое спасибо. Работала отлично, пока 'diffLength' не стал отрицательным с более коротким' setY'. Я изменил функцию 'calculateCosine' на pad' setY', а не на 'setX'. Еще раз спасибо. – salvu

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

  • Нет связанных вопросов^_^