2017-09-23 6 views
0

私は2つの単語のベクトルを持っています。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'ですが、これは正しくありません。

もう一度お返事いただきありがとうございます。