Thu Oct 22, 2020 5:51 pm
Login Register Lost Password? Contact Us


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: 17
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