Wed Jun 29, 2022 12:13 pm
Login Register Lost Password? Contact Us

Please Note: The HPCC Systems forums are moving to Stack Overflow. We invite you to post your questions on Stack Overflow utilizing the tag hpcc-ecl (https://stackoverflow.com/search?tab=newest&q=hpcc-ecl). This legacy forum will be active and monitored during our transition to Stack Overflow but will become read only beginning September 1, 2022.



SETS VERIFICATION

Fórum em português para questões gerais e suporte relacionados a ECL/HPCC Systems.

Moderator: hwatanuki

Tue Jul 23, 2019 2:32 pm Change Time Zone

Bom dia, em um dos meus estudos de data mining encontrei uma certa dificuldade.

Em texto de avaliações de restaurantes eu gostaria de filtrar qual ponto é mais relevante ao avaliar um estabelecimento(comida, servico, ambiente e etc). Um modo que pensei para esta verificação é a criação de um SET contendo as palavras chaves relacionadas a cada um desses pontos.

O problema surgiu no momento que preciso verificar se o texto da avaliação possui alguma das palavras existentes nos set anteriormente citados. Não é possivel fazer a utilização do texto atrelado com a operação IN, uma vez que o texto é tratado como "uma unica" palavra e entao nao coincide com nenhuma informação do SET de palavras chaves, e o outro modo que havia pensado era a criação de um SET baseado no texto da avaliação, separando as suas palavras pelo espaço em branco entre elas, porem, novamente, não é possivel fazer o uso da operação IN entre dois SETS.

Segue um trecho do codigo para melhor visualização.

Code: Select all
IMPORT STD;

keywords_FOOD := ['dinner', 'food', 'buffet', 'flavor', 'meal', 'meals', 'lunch'];

keywords_SERVICE := ['service', 'server', 'waitress', 'waiter', 'bill'];

keywords_TOILET := ['toilet', 'sink', 'bathrooms', 'bathroom'];

keywords_PRICE := ['pay', 'cost', 'expensive', 'cheap', 'payless'];

keywords_place := ['place', 'decor', 'ambiance', 'dirty', 'clean'];

review  := 'Total bill for this horrible service? Over $8Gs. These crooks actually had the nerve to charge us $69 for 3 pills. I checked online the pills can be had for 19 cents EACH! Avoid Hospital ERs at all costs.';
set_review := STD.STR.SplitWords(review,' ');

OUTPUT(review);
OUTPUT(set_review);


Gostaria de saber se existe algum modo no qual eu possa comparar dois SETS e afirmar se existe pelo menos 1 elemento presente em ambos ou algum modo no qual eu possa verificar se uma frase possui palavras presentes em um SET.

Desde já agradeço.
elimar.macena
 
Posts: 1
Joined: Tue Jul 23, 2019 2:15 pm

Wed Jul 24, 2019 1:05 pm Change Time Zone

Olá Elimar,

Compartilhei essa questão com o time de treinamento e o Richard propôs uma solução via a criação de datasets filho aninhados para cada categoria de palavras-chave. Em seguida, uma função que limpa, categoriza e divide o texto, retorna um NORMALIZE associando cada palavra-chave encontrada com sua respectiva categoria. Veja o código sugerido abaixo.


Code: Select all

IMPORT STD;

keywords := MODULE;
  FOOD    := ['dinner', 'food', 'buffet', 'flavor', 'meal', 'meals', 'lunch'];
  SERVICES:= ['service', 'server', 'waitress', 'waiter', 'bill'];
  TOILET  := ['toilet', 'sink', 'bathrooms', 'bathroom'];
  PRICE   := ['pay', 'cost', 'expensive', 'cheap', 'payless']; 
  PLACE   := ['place', 'decor', 'ambiance', 'dirty', 'clean'];

  //nested child dataset -- all terms and their categories
  Crec := {STRING Term}; //child record structure
  EXPORT SearchTermsDS := DATASET([{'FOOD',DATASET(FOOD,Crec)},
                                   {'SERVICES',DATASET(SERVICES,Crec)},
                                   {'TOILET',DATASET(TOILET,Crec)},
                                   {'PRICE',DATASET(PRICE,Crec)},
                                   {'PLACE',DATASET(PLACE,Crec)}],
                                  {STRING10 TermType, DATASET(Crec) Terms});
  //the "garbage" characters to lose from the text
  EXPORT BadChars := '?.$!';
END;

EvalReview(STRING r) := FUNCTION
  //first lose the "garbage" characters and lowercase the text
  CleanText := STD.Str.SubstituteIncluded(r,keywords.BadChars,'');
  LowerText := STD.Str.ToLowerCase(CleanText);
  ReviewSet := STD.STR.SplitWords(LowerText,' '); //create the set of words
     
  Found := keywords.SearchTermsDS.Terms(Term IN ReviewSet);
  RETURN NORMALIZE(keywords.SearchTermsDS,
                   LEFT.Terms(Term IN SET(Found, Term)),
                   TRANSFORM({STRING TermType,STRING Term},
                             SELF.TermType := LEFT.TermType,
                             SELF.Term := RIGHT.Term));
END;

review1  := 'Total bill for this horrible service? Over $8Gs. These crooks actually had the nerve to charge us $69 for 3 pills. I checked online the pills can be had for 19 cents EACH! Avoid Hospital ERs at all costs.';
review2  := 'The price was outrageoous! The waiter and dinner were both terrible. NEVER coming back!!';

EvalReview(review1);
EvalReview(review2);
hwatanuki
 
Posts: 28
Joined: Mon Apr 15, 2019 1:22 am


Return to Português

Who is online

Users browsing this forum: No registered users and 1 guest

cron