SAS - извлечение сопоставленного текста из предложений в разных таблицах с повторяющимися выводами - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующая цель, которую я хочу достичь:

У меня есть две таблицы.В одной из таблиц (Table_one) есть столбец «Предложение».Он имеет следующие значения:

SENTENCE
I live in New York
A bad day
A very good day

У меня есть другая таблица (Table_two) со столбцом с именем «Текст» в форме:

TEXT
New York
good day
very good day

Я хочу сопоставить фразы в«Текст» к предложениям в «предложениях», чтобы увидеть, содержатся ли они в каком-либо из наблюдений «предложений».Я хочу вывести те предложения, которые содержат текст.

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

Мне нужна таблица, которая приводит к:

MATCH
I live in New York
A very good day
A very good day

Я попробовал следующий код:

proc sql;
create table match as 
select a.* from table_one as a, table_two as b
where find(a.Sentence, b.Text)>0
;
run; 

Я получаю следующий результат:

MATCH
I live in New York
A very good day

Другими словами, поскольку наблюдения в Table_two: «хороший день» и «очень хороший день» оба содержатся в предложении Table_one: «очень хороший день», он трактуется какединичное наблюдение и возвращалось только один раз в выводе.

Однако я хотел бы, чтобы обе фразы обрабатывались как отдельные наблюдения и выводились дважды, как мой желаемый вывод.

Я пробовал обаФункции FIND () и INDEX ().Но оба дают мне одинаковые результаты.

Есть ли какой-либо способ избежать вывода одного наблюдения и получить два отдельных наблюдения, даже если в одном предложении есть фразы?

Любая помощь будет принята с благодарностью,

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Не уверен, почему вы получаете отчетливые результаты, когда не запрашиваете их.У вас могут быть проблемы с переменной длиной, или вам потребуется TRIM подстроки поиска. В следующем примере показано, что результаты запроса - это то, что вам нужно, если используется trim.

data phrases;
length sentence $200;
input; SENTENCE = _infile_; datalines;
I live in New York
A bad day
A very good day
data terms;
length text $30;
input; text = _infile_; datalines;
New York
good day
very good day
run;

proc sql;
create table match as 
select 
  phrases.*, text as matched_on
from 
  phrases, terms
where 
  find(phrases.Sentence, trim(terms.Text))>0
;
quit;

Удалите , text as matched_onи вы получите такое же количество строк в результате

0 голосов
/ 08 октября 2018

Если я правильно понимаю, это должно дать вам то, что вы хотите.Поищите в каждой SENTENCE текст, если и когда будет найдено совпадение, и перестаньте искать.

data SENTENCE;
   input sentence $80.;
   cards;
I live in New York
A bad day
A very good day
;;;;
   run;
data text;
   infile cards eof=eof;
   input text $80.;
   return;
 eof:
   call symputx('obs',_n_-1);
   cards;
New York
good day
very good day
;;;;
   run;
%put NOTE: &=obs;
data found;
   if _n_ eq 1 then do;
      array txt[&obs] $80 _temporary_;
      do i = 1 to dim(txt) while(not eof);
         set text end=eof;
         txt[i]=text;
         end;
      end;
   set sentence;
   do i = 1 to dim(txt);
      if find(sentence,txt[i],1,'T') then do;
         text=txt[i];
         output;
         leave;
         end;
      end;
   drop i;
   run;
proc print;
   run;
...