Удалить слова из поля, используя слова из таблицы в SAS - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь удалить слова из поля в SAS, используя таблицу слов.

Мне удалось выделить каждое слово с помощью некоторого кода, найденного в Интернете, но я не могу удалитьслово из поля.

Например, если поле:

«Лиса прыгнула над луной»

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

"Лиса над луной"

Вот таблица стоп-слов для удаления:

PROC SQL;
   CREATE TABLE BOW.QUERY_FOR_STOPWORDS AS 
   SELECT t1.StopWords
      FROM BOW.STOPWORDS t1;
QUIT;

Вот таблица споле, которое необходимо удалить:

PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_ANNU_COMMENTS AS 
   SELECT t1.Comment
      FROM BOW.ANNU_COMMENTS t1;
QUIT;

Ответы [ 4 ]

1 голос
/ 08 апреля 2019

В зависимости от того, сколько слов у вас есть другие решения.

data _NULL_;
    set STOPWORDS end=e;
    if _N_=1 then call execute('data result;set ANNU_COMMENTS;newComment=Comment;');
    call execute('if _N_=1 then __'||put(_N_,z30.)||'+prxparse("s/'||trimn(StopWords)||'//");');
    call execute('call prxchange(__'||put(_N_,z30.)||',-1,newComment);');   
    if e then call execute('drop __:;run;');
run;

Это будет принимать стоп-слова генерировать из него шаг данных, чем комментарии этого шага процесса обработки данных.

РЕДАКТИРОВАТЬ: Удалить только словаграницу слова вы должны использовать \ b в регулярном выражении.

data _NULL_;
    set STOPWORDS end=e;
    if _N_=1 then call execute('data result;set ANNU_COMMENTS;newComment=Comment;');
    call execute('if _N_=1 then __'||put(_N_,z30.)||'+prxparse("s/\b'||trimn(StopWords)||'\b//");');
    call execute('call prxchange(__'||put(_N_,z30.)||',-1,newComment);');   
    if e then call execute('drop __:;run;');
run;
0 голосов
/ 09 апреля 2019

Можно написать макрос, который генерирует шаг очистки данных.

В этом примере Шенглин использует использование tranwrd с кодовым кодом Ли.

%macro flense (
  data=Commments,
  var=Comment, 
  newvar=CommentFlensed, 
  censor=BOW.StopWordsList,
  term=StopWords
);

  proc sql noprint;
    select quote(trim(&term),"'") into :sq_word1-;  * single quote the words to prevent possible macro evaluation later;
    from &censorData;

  data &out;
    set &data;
    &newvar = &var;

    %* for each censored word, generate an if statement
     * that checks if the word (or term) is present, and if so
     * removes the word from the new variable;

    %local i quoted_word;
    %do i = 1 %to &SQLOBS;

      %let quoted_word = &&&sq_word&i;

      if (indexw(&newvar.,&quoted_word)) then 
        &newvar = tranwrd(&newvar,&quoted_word,'');

    %end;
  run;

%mend;

%flense();
0 голосов
/ 08 апреля 2019

Вы можете попробовать использовать итератор хеша, например:

data want;
   if 0 then set STOPWORDS;
   if _n_=1 then do;
      declare hash h(dataset:'STOPWORDS');
      declare hiter iter('h');
      h.definekey('StopWords');
      h.definedata('StopWords');
      h.definedone();
   end;
   set ANNU_COMMENTS;
      rc=iter.first();
      do while(rc=0);
          newComment=ifc(findw(newComment,strip(StopWords))>0,tranwrd(newComment,strip(StopWords),''),newComment);
          rc=iter.next();
      end;
    drop StopWords rc;
run;
0 голосов
/ 08 апреля 2019

Основная идея: replace():

SELECT REPLACE(t1.Comment, 'jumped', '')
FROM BOW.ANNU_COMMENTS t1;

Однако у вас есть проблема с пробелами.Если это проблема, и вам нужны полные слова, то это может сработать:

SELECT TRIM(BOTH ' ' FROM REPLACE(' ' || t1.Comment || ' ', ' jumped ', ''))
FROM BOW.ANNU_COMMENTS t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...