2017-09-23 10 views
0

두 단어의 벡터가 있습니다.문자열 일치 R : 가능한 최상의 일치 찾기

Corpus<- c('animalada', 'fe', 'fernandez', 'ladrillo') 

Lexicon<- c('animal', 'animalada', 'fe', 'fernandez', 'ladr', 'ladrillo') 

어휘와 코퍼스간에 가능한 한 일치시켜야합니다. 많은 방법을 시도했습니다. 이것은 그들 중 하나입니다.

library(stringr) 

match<- paste(Lexicon,collapse= '|^') # I use the stemming method (snowball), so the words in Lexicon are root of words 

test<- str_extrac_all (Corpus,match,simplify= T) 

test 

[,1] 
[1,] "animal" 
[2,] "fe" 
[3,] "fe" 
[4,] "ladr" 

하지만, 경기는해야한다 :

[1,] "animalada" 
[2,] "fe" 
[3,] "fernandez" 
[1,] "ladrillo" 

대신 경기가 알파벳 순으로 내 어휘에 주문한 첫 번째 단어입니다. 그건 그렇고,이 벡터들은 내가 가지고있는 더 큰 목록의 표본입니다.

어떻게 작동하는지 모르므로 regex()를 시도하지 않았습니다. 아마도 그 해결책은 그렇게 될 것입니다.

이 문제를 해결하는 데 도움을 주시겠습니까? 도와 줘서 고마워.

답변

0

당신은 문자의 숫자로 Lexicon을 주문할 수 있습니다 패턴이 있고, 가장 일치가 먼저 있도록, 내림차순 :

match<- paste(Lexicon[order(-nchar(Lexicon))], collapse = '|^') 

test<- str_extract_all(Corpus, match, simplify= T) 

test 
#  [,1]  
#[1,] "animalada" 
#[2,] "fe"  
#[3,] "fernandez" 
#[4,] "ladrillo" 
+0

저는 실제 어휘집으로 답을 테스트하고 있습니다. 나중에 결과를 알려 드리겠습니다. 둘 다 고마워. – pch919

1

당신은 단지 match 기능을 사용할 수 있습니다.

Index <- match(Corpus, Lexicon) 

Index 
[1] 2 3 4 6 

Lexicon[Index] 
[1] "animalada" "fe" "fernandez" "ladrillo" 
0

나는 두 가지 방법 모두 시도했지만 올바른 것은 @Psidorm이 제안한 것입니다. 함수 match()을 사용하면 단어의 어느 부분에서나 일치하는 항목을 찾을 수 있습니다. 처음에는 필요하지 않습니다. 예 :

Corpus<- c('tambien') 
Lexicon<- c('bien') 
match(Corpus,Lexicon) 

결과는 'tambien'이지만 올바르지 않습니다.

다시 한 번 도움을 주셔서 감사합니다.