2015-04-03 2 views
0

Вот что я пытаюсь сделать: Когда термин, который я анализирую, является «яблоки», мне хотелось бы знать, сколько транспозиций необходимо на «яблоки», чтобы его можно было найти в строке.подсчитайте транспозиции, необходимые для строки, чтобы ее можно было найти в другой строке

«купить яблоки сейчас» => 0 необходима транспозиция (присутствуют яблоки).

«дешевый аксессуар онлайн» => требуется 1 транспозиция (яблоки к яблокам).

«найти здесь ваше место» => 2 транспозиции необходимы (яблоки на плече).

"aple" => Требуется 2 транспозиции (яблоки для APLE).

«бананы» => необходимо 5 транспозиций (яблоки для бананов).

stringdist и функции adist не работают, потому что они говорят мне, сколько транспозиций необходимо для преобразования одной строки в другую. Во всяком случае, вот то, что я написал до сих пор:

#build matrix 
a <- c(rep("apples",5),rep("bananas",3)) 
b <- c("buy apples now","cheap aples online","find your ap ple here","aple","bananas","cherry and bananas","pumpkin","banana split") 
d<- data.frame(a,b) 
colnames(d)<-c("term","string") 

#count transpositions needed 
d$transpositions <- mapply(adist,d$term,d$string) 
print(d) 
+0

ОК спасибо, должен ли я добавить его в заголовок слишком или достаточно для метки? –

+0

Я отредактировал ваш код (в моем ответе), чтобы быть яблоками в 'a <- c (rep (" apples ", 5), rep (" bananas ", 3))' – infominer

+0

Ouch, thanks infominer, позвольте мне исправить его вопрос тоже! –

ответ

0

вам нужно проверить на яблоки, а затем сделать транспозиции

a <- c(rep("apples",5),rep("bananas",3)) 
b <- c("buy apples now","cheap aples online","find your ap ple here","aple","bananas","cherry and bananas","pumpkin","banana split") 
d<- data.frame(a,b, stringsAsFactors = F) 
colnames(d)<-c("term","string") 

#check for apples first 
d$apples <-grepl("apples", d$string) 

#count transpositions needed 
d$transpositions <- ifelse(d$apples ==FALSE, mapply(adist,d$term,d$string), 0) 
print(d) 
+0

Хм, я просто перечитаю ваш вопрос, придется пересмотреть свой ответ. Я опубликую его, когда буду иметь дело с ним позже. Как вы хотите иметь дело с предложениями, а не с одним преобразованием слов? – infominer

+0

Цистерны @infominer! очень ценится :) grepl полезен. Первый шаг, действительно, обнаруживает наличие слова, правильно записанного в строке. Если правильно написанный термин не найден, тогда мне нужно изолировать кусок строки, который наиболее похож на мой термин, и, наконец, вычислить сходство между этой частью строки и термином. Что касается предложений в отличие от «одного слова», я хочу избежать того, что «купите aple сейчас» получает худший результат, чем «aple» из-за дополнительных слов «buy and now». Важно то, как подобный раздел «aple» «buy aple now» относится к термину «яблоко». –

0

Итак, вот грязный решение, которое я придумал до сих пор:

#create a data.frame 
a <- c(rep("apples",5),rep("banana split",3)) 
b <- c("buy apples now","cheap aples online","find your ap ple here","aple","bananas","cherry and bananas","pumpkin","banana split") 
d <- data.frame(a,b) 
colnames(d) <- c("term","string") 

#split the string into sequences of consecutive characters whose length is equal to the length of the term on the same row. Calculate the similarity to the term of each sequence of characters and identify the most relevant piece of string for each row. 

mostrelevantpiece <- NULL 

for (j in 1:length(d$string)){ 
    pieces<-NULL 
    piecesdist<-NULL 
    for (i in 1:max((nchar(as.character(d$string[j]))-nchar(as.character(d$term[j])))+1,1)){ 
    addpiece <- substr(d$string[j],i,i+nchar(as.character(d$term[j]))-1) 
    dist <- adist(addpiece,d$term[j]) 
    pieces[i] <- str_trim(addpiece) 
    piecesdist[i] <- dist 
    mostrelevantpiece[j] <- pieces[which.min(piecesdist)] 
    } 
} 

#calculate the number of transpositions needed to transform the "most relevant piece of string" into the term. 

d$transpositionsneeded <- mapply(adist,mostrelevantpiece,d$term)