1*993b0882SAndroid Build Coastguard Worker /* 2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*993b0882SAndroid Build Coastguard Worker * 4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*993b0882SAndroid Build Coastguard Worker * 8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*993b0882SAndroid Build Coastguard Worker * 10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*993b0882SAndroid Build Coastguard Worker * limitations under the License. 15*993b0882SAndroid Build Coastguard Worker */ 16*993b0882SAndroid Build Coastguard Worker 17*993b0882SAndroid Build Coastguard Worker #ifndef LIBTEXTCLASSIFIER_ACTIONS_REGEX_ACTIONS_H_ 18*993b0882SAndroid Build Coastguard Worker #define LIBTEXTCLASSIFIER_ACTIONS_REGEX_ACTIONS_H_ 19*993b0882SAndroid Build Coastguard Worker 20*993b0882SAndroid Build Coastguard Worker #include <memory> 21*993b0882SAndroid Build Coastguard Worker #include <string> 22*993b0882SAndroid Build Coastguard Worker #include <vector> 23*993b0882SAndroid Build Coastguard Worker 24*993b0882SAndroid Build Coastguard Worker #include "actions/actions_model_generated.h" 25*993b0882SAndroid Build Coastguard Worker #include "actions/types.h" 26*993b0882SAndroid Build Coastguard Worker #include "utils/flatbuffers/mutable.h" 27*993b0882SAndroid Build Coastguard Worker #include "utils/utf8/unilib.h" 28*993b0882SAndroid Build Coastguard Worker #include "utils/zlib/zlib.h" 29*993b0882SAndroid Build Coastguard Worker 30*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 { 31*993b0882SAndroid Build Coastguard Worker 32*993b0882SAndroid Build Coastguard Worker // Regular expression backed actions suggestions. 33*993b0882SAndroid Build Coastguard Worker class RegexActions { 34*993b0882SAndroid Build Coastguard Worker public: RegexActions(const UniLib * unilib,const std::string & smart_reply_action_type)35*993b0882SAndroid Build Coastguard Worker explicit RegexActions(const UniLib* unilib, 36*993b0882SAndroid Build Coastguard Worker const std::string& smart_reply_action_type) 37*993b0882SAndroid Build Coastguard Worker : unilib_(*unilib), smart_reply_action_type_(smart_reply_action_type) {} 38*993b0882SAndroid Build Coastguard Worker 39*993b0882SAndroid Build Coastguard Worker // Decompresses and initializes all rules in a model. 40*993b0882SAndroid Build Coastguard Worker bool InitializeRules( 41*993b0882SAndroid Build Coastguard Worker const RulesModel* rules, const RulesModel* low_confidence_rules, 42*993b0882SAndroid Build Coastguard Worker const TriggeringPreconditions* triggering_preconditions_overlay, 43*993b0882SAndroid Build Coastguard Worker ZlibDecompressor* decompressor); 44*993b0882SAndroid Build Coastguard Worker 45*993b0882SAndroid Build Coastguard Worker // Checks whether the input triggers the low confidence rules. 46*993b0882SAndroid Build Coastguard Worker bool IsLowConfidenceInput( 47*993b0882SAndroid Build Coastguard Worker const Conversation& conversation, const int num_messages, 48*993b0882SAndroid Build Coastguard Worker std::vector<const UniLib::RegexPattern*>* post_check_rules) const; 49*993b0882SAndroid Build Coastguard Worker 50*993b0882SAndroid Build Coastguard Worker // Checks and filters suggestions triggering the low confidence post checks. 51*993b0882SAndroid Build Coastguard Worker bool FilterConfidenceOutput( 52*993b0882SAndroid Build Coastguard Worker const std::vector<const UniLib::RegexPattern*>& post_check_rules, 53*993b0882SAndroid Build Coastguard Worker std::vector<ActionSuggestion>* actions) const; 54*993b0882SAndroid Build Coastguard Worker 55*993b0882SAndroid Build Coastguard Worker // Suggests actions for a conversation from a message stream using the regex 56*993b0882SAndroid Build Coastguard Worker // rules. 57*993b0882SAndroid Build Coastguard Worker bool SuggestActions(const Conversation& conversation, 58*993b0882SAndroid Build Coastguard Worker const MutableFlatbufferBuilder* entity_data_builder, 59*993b0882SAndroid Build Coastguard Worker std::vector<ActionSuggestion>* actions) const; 60*993b0882SAndroid Build Coastguard Worker 61*993b0882SAndroid Build Coastguard Worker private: 62*993b0882SAndroid Build Coastguard Worker struct CompiledRule { 63*993b0882SAndroid Build Coastguard Worker const RulesModel_::RegexRule* rule; 64*993b0882SAndroid Build Coastguard Worker std::unique_ptr<UniLib::RegexPattern> pattern; 65*993b0882SAndroid Build Coastguard Worker std::unique_ptr<UniLib::RegexPattern> output_pattern; CompiledRuleCompiledRule66*993b0882SAndroid Build Coastguard Worker CompiledRule(const RulesModel_::RegexRule* rule, 67*993b0882SAndroid Build Coastguard Worker std::unique_ptr<UniLib::RegexPattern> pattern, 68*993b0882SAndroid Build Coastguard Worker std::unique_ptr<UniLib::RegexPattern> output_pattern) 69*993b0882SAndroid Build Coastguard Worker : rule(rule), 70*993b0882SAndroid Build Coastguard Worker pattern(std::move(pattern)), 71*993b0882SAndroid Build Coastguard Worker output_pattern(std::move(output_pattern)) {} 72*993b0882SAndroid Build Coastguard Worker }; 73*993b0882SAndroid Build Coastguard Worker 74*993b0882SAndroid Build Coastguard Worker // Decompresses and initializes a set of regular expression rules. 75*993b0882SAndroid Build Coastguard Worker bool InitializeRulesModel(const RulesModel* rules, 76*993b0882SAndroid Build Coastguard Worker ZlibDecompressor* decompressor, 77*993b0882SAndroid Build Coastguard Worker std::vector<CompiledRule>* compiled_rules) const; 78*993b0882SAndroid Build Coastguard Worker 79*993b0882SAndroid Build Coastguard Worker const UniLib& unilib_; 80*993b0882SAndroid Build Coastguard Worker const std::string smart_reply_action_type_; 81*993b0882SAndroid Build Coastguard Worker std::vector<CompiledRule> rules_, low_confidence_rules_; 82*993b0882SAndroid Build Coastguard Worker }; 83*993b0882SAndroid Build Coastguard Worker 84*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3 85*993b0882SAndroid Build Coastguard Worker 86*993b0882SAndroid Build Coastguard Worker #endif // LIBTEXTCLASSIFIER_ACTIONS_REGEX_ACTIONS_H_ 87