├── explores ├── .gitkeep └── review.explore.lkml ├── views ├── .gitkeep ├── tag.view.lkml ├── location.view.lkml ├── entity.view.lkml ├── hierarchy_relation.view.lkml ├── sentence.view.lkml ├── attribute_relation.view.lkml └── review.view.lkml ├── dashboards ├── .gitkeep ├── voice_of_customer_nlp_topic_analysis.dashboard.lookml ├── voice_of_customer_ratings_overview.dashboard.lookml └── voice_of_customer_nlp_analysis.dashboard.lookml ├── manifest.lkml ├── marketplace.json ├── LICENSE ├── README.md └── block_keboola_reviews_v2.model.lkml /explores/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboards/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /manifest.lkml: -------------------------------------------------------------------------------- 1 | project_name: "block-keboola-reviews" 2 | 3 | ################ Constants ################ 4 | 5 | constant: CONNECTION { 6 | value: "keboola_block_reviewtrackers_hospitality" 7 | export: override_optional 8 | } 9 | 10 | constant: SCHEMA_NAME { 11 | value: "WORKSPACE_506436037" 12 | export: override_optional 13 | } 14 | -------------------------------------------------------------------------------- /views/tag.view.lkml: -------------------------------------------------------------------------------- 1 | view: tag { 2 | sql_table_name: @{SCHEMA_NAME}.TAG ;; 3 | 4 | dimension: tag_id { 5 | primary_key: yes 6 | hidden: yes 7 | type: string 8 | sql: ${TABLE}."TAG_ID" ;; 9 | } 10 | 11 | dimension: review_id { 12 | type: string 13 | hidden: yes 14 | sql: ${TABLE}."REVIEW_ID" ;; 15 | } 16 | 17 | dimension: tag { 18 | type: string 19 | sql: ${TABLE}."TAG" ;; 20 | } 21 | 22 | measure: count { 23 | label: "Tags" 24 | type: count 25 | drill_fields: [detail*, count] 26 | } 27 | 28 | # ----- Sets of fields for drilling ------ 29 | set: detail { 30 | fields: [ 31 | location.location, 32 | review.review_published_date, 33 | review.source, 34 | review.rating_stars 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /marketplace.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Voice of the Customer with NLP", 3 | "category_label": "Models", 4 | "branding": { 5 | "image_uri": "https://marketplace-api.looker.com/block-icons/KeboolaBrand.png", 6 | "tagline": "Get instant access to reviews from sources such as Google, Yelp, Tripadvisor, GlassDoor and others to analyze feedback and track trends across brands and locations, including competition monitoring and benchmarking." 7 | }, 8 | 9 | "constants": { 10 | "CONNECTION": { 11 | "label": "Connection Name", 12 | "value_constraint": "connection" 13 | }, 14 | "SCHEMA_NAME": { 15 | "label": "Schema Name" 16 | } 17 | }, 18 | "models": [ 19 | { 20 | "name": "block_keboola_reviews_v2", 21 | "connection_constant": "CONNECTION" 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | "MIT License 2 | 3 | Copyright (c) 2021 Google 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE." 22 | -------------------------------------------------------------------------------- /explores/review.explore.lkml: -------------------------------------------------------------------------------- 1 | include: "/views/review.view" 2 | include: "/views/entity.view" 3 | include: "/views/location.view" 4 | include: "/views/attribute_relation.view" 5 | include: "/views/hierarchy_relation.view" 6 | include: "/views/sentence.view" 7 | include: "/views/tag.view" 8 | 9 | explore: review { 10 | join: entity { 11 | type: left_outer 12 | sql_on: ${review.review_id} = ${entity.review_id} ;; 13 | relationship: one_to_many 14 | } 15 | 16 | join: location { 17 | type: left_outer 18 | sql_on: ${review.location_id} = ${location.location_id} ;; 19 | relationship: many_to_one 20 | } 21 | 22 | join: attribute_relation { 23 | type: left_outer 24 | sql_on: ${review.review_id} = ${attribute_relation.review_id} ;; 25 | relationship: one_to_many 26 | } 27 | 28 | join: hierarchy_relation { 29 | type: left_outer 30 | sql_on: ${review.review_id} = ${hierarchy_relation.review_id} ;; 31 | relationship: one_to_many 32 | } 33 | 34 | join: sentence { 35 | type: left_outer 36 | sql_on: ${review.review_id} = ${sentence.review_id} ;; 37 | relationship: one_to_many 38 | } 39 | 40 | join: tag { 41 | type: left_outer 42 | sql_on: ${review.review_id} = ${tag.review_id} ;; 43 | relationship: one_to_many 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /views/location.view.lkml: -------------------------------------------------------------------------------- 1 | view: location { 2 | sql_table_name: @{SCHEMA_NAME}.LOCATION ;; 3 | 4 | dimension: location_id { 5 | hidden: yes 6 | primary_key: yes 7 | type: string 8 | sql: ${TABLE}."LOCATION_ID" ;; 9 | } 10 | 11 | dimension: city { 12 | type: string 13 | sql: ${TABLE}."CITY" ;; 14 | } 15 | 16 | dimension: country { 17 | type: string 18 | map_layer_name: countries 19 | sql: ${TABLE}."COUNTRY" ;; 20 | } 21 | 22 | dimension: location { 23 | type: string 24 | sql: ${TABLE}."LOCATION" ;; 25 | } 26 | 27 | dimension: latitude { 28 | hidden: yes 29 | type: string 30 | sql: ${TABLE}."LATITUDE" ;; 31 | } 32 | 33 | dimension: longitude { 34 | hidden: yes 35 | type: string 36 | sql: ${TABLE}."LONGITUDE" ;; 37 | } 38 | 39 | dimension: location_gps { 40 | type: location 41 | label: "Location GPS" 42 | sql_latitude: ${latitude} ;; 43 | sql_longitude: ${longitude} ;; 44 | } 45 | 46 | dimension: state { 47 | type: string 48 | sql: ${TABLE}."STATE" ;; 49 | } 50 | 51 | dimension: street { 52 | type: string 53 | sql: ${TABLE}."STREET" ;; 54 | } 55 | 56 | dimension: zipcode { 57 | type: zipcode 58 | sql: ${TABLE}."ZIPCODE" ;; 59 | } 60 | 61 | measure: count { 62 | label: "Locations" 63 | type: count 64 | drill_fields: [country, city, count] 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /views/entity.view.lkml: -------------------------------------------------------------------------------- 1 | view: entity { 2 | sql_table_name: @{SCHEMA_NAME}.ENTITY ;; 3 | 4 | dimension: entity_id { 5 | hidden: yes 6 | primary_key: yes 7 | type: string 8 | sql: ${TABLE}."ENTITY_ID" ;; 9 | } 10 | 11 | dimension: entity { 12 | type: string 13 | sql: ${TABLE}."ENTITY" ;; 14 | } 15 | 16 | dimension: entity_type { 17 | type: string 18 | sql: ${TABLE}."ENTITY_TYPE" ;; 19 | } 20 | 21 | dimension: review_id { 22 | type: string 23 | # hidden: yes 24 | sql: ${TABLE}."REVIEW_ID" ;; 25 | } 26 | 27 | dimension: sentiment_label { 28 | type: string 29 | sql: ${TABLE}."SENTIMENT_LABEL" ;; 30 | } 31 | 32 | dimension: sentiment_value_dimension { 33 | hidden: yes 34 | type: number 35 | sql: ${TABLE}."SENTIMENT_VALUE" ;; 36 | } 37 | 38 | measure: entity_sentiment_value { 39 | label: "Entity Sentiment Value" 40 | type: average 41 | sql: ${sentiment_value_dimension} ;; 42 | value_format: "# ##0.0#" 43 | drill_fields: [detail*, entity_sentiment_value] 44 | } 45 | 46 | measure: count { 47 | label: "Entities" 48 | type: count 49 | drill_fields: [detail*, entity_type, entity, count] 50 | } 51 | 52 | # ----- Sets of fields for drilling ------ 53 | set: detail { 54 | fields: [ 55 | location.location, 56 | review.review_published_date, 57 | review.review_text_short, 58 | review.source, 59 | review.rating_stars, 60 | sentiment_label 61 | ] 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /views/hierarchy_relation.view.lkml: -------------------------------------------------------------------------------- 1 | view: hierarchy_relation { 2 | sql_table_name: @{SCHEMA_NAME}.HIERARCHY_RELATION ;; 3 | 4 | dimension: hierarchy_relation_id { 5 | primary_key: yes 6 | type: string 7 | sql: ${TABLE}."HIERARCHY_RELATION_ID" ;; 8 | } 9 | 10 | dimension: entity { 11 | type: string 12 | sql: ${TABLE}."ENTITY" ;; 13 | } 14 | 15 | dimension: object { 16 | type: string 17 | sql: ${TABLE}."OBJECT" ;; 18 | } 19 | 20 | dimension: review_id { 21 | type: string 22 | # hidden: yes 23 | sql: ${TABLE}."REVIEW_ID" ;; 24 | } 25 | 26 | dimension: sentiment_label { 27 | type: string 28 | sql: ${TABLE}."SENTIMENT_LABEL" ;; 29 | } 30 | 31 | dimension: sentiment_value_dimension { 32 | hidden: yes 33 | type: number 34 | sql: ${TABLE}."SENTIMENT_VALUE" ;; 35 | } 36 | 37 | measure: hierarchy_sentiment_value { 38 | label: "Hierarchy Sentiment Value" 39 | type: average 40 | sql: ${sentiment_value_dimension} ;; 41 | value_format: "# ##0.0#" 42 | drill_fields: [detail*, hierarchy_sentiment_value] 43 | } 44 | 45 | measure: count { 46 | label: "Relations" 47 | type: count 48 | drill_fields: [detail*, object, entity, count] 49 | } 50 | 51 | # ----- Sets of fields for drilling ------ 52 | set: detail { 53 | fields: [ 54 | location.location, 55 | review.review_published_date, 56 | review.review_text_short, 57 | review.source, 58 | review.rating_stars, 59 | sentiment_label 60 | ] 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /views/sentence.view.lkml: -------------------------------------------------------------------------------- 1 | view: sentence { 2 | sql_table_name: @{SCHEMA_NAME}.SENTENCE ;; 3 | 4 | dimension: sentence_id { 5 | hidden: yes 6 | primary_key: yes 7 | type: string 8 | sql: ${TABLE}."SENTENCE_ID" ;; 9 | } 10 | 11 | dimension: order { 12 | type: number 13 | sql: ${TABLE}."ORDER" ;; 14 | } 15 | 16 | dimension: review_id { 17 | type: string 18 | hidden: yes 19 | sql: ${TABLE}."REVIEW_ID" ;; 20 | } 21 | 22 | dimension: segment { 23 | type: string 24 | sql: ${TABLE}."SEGMENT" ;; 25 | } 26 | 27 | dimension: sentence { 28 | type: string 29 | sql: ${TABLE}."SENTENCE" ;; 30 | } 31 | 32 | dimension: sentiment_label { 33 | type: string 34 | sql: ${TABLE}."SENTIMENT_LABEL" ;; 35 | } 36 | 37 | dimension: sentiment_value_dimension { 38 | hidden: yes 39 | type: number 40 | sql: ${TABLE}."SENTIMENT_VALUE" ;; 41 | } 42 | 43 | measure: sentence_sentiment_value { 44 | label: "Sentence Sentiment Value" 45 | type: average 46 | sql: ${sentiment_value_dimension} ;; 47 | value_format: "# ##0.0#" 48 | drill_fields: [detail*, sentence_sentiment_value] 49 | } 50 | 51 | measure: count { 52 | label: "Sentences" 53 | type: count 54 | drill_fields: [detail*, count] 55 | } 56 | 57 | # ----- Sets of fields for drilling ------ 58 | set: detail { 59 | fields: [ 60 | location.location, 61 | review.review_published_date, 62 | review.review_text_short, 63 | review.source, 64 | review.rating_stars, 65 | sentiment_label 66 | ] 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /views/attribute_relation.view.lkml: -------------------------------------------------------------------------------- 1 | view: attribute_relation { 2 | sql_table_name: @{SCHEMA_NAME}.ATTRIBUTE_RELATION ;; 3 | 4 | dimension: attribute_relation_id { 5 | hidden: yes 6 | primary_key: yes 7 | type: string 8 | sql: ${TABLE}."ATTRIBUTE_RELATION_ID" ;; 9 | } 10 | 11 | dimension: attribute { 12 | type: string 13 | sql: ${TABLE}."ATTRIBUTE" ;; 14 | } 15 | 16 | dimension: review_id { 17 | type: string 18 | hidden: yes 19 | sql: ${TABLE}."REVIEW_ID" ;; 20 | } 21 | 22 | dimension: subject { 23 | type: string 24 | sql: ${TABLE}."SUBJECT" ;; 25 | } 26 | 27 | dimension: sentiment_label { 28 | type: string 29 | sql: ${TABLE}."SENTIMENT_LABEL" ;; 30 | } 31 | 32 | dimension: sentiment_value_dimension { 33 | hidden: yes 34 | type: number 35 | sql: ${TABLE}."SENTIMENT_VALUE" ;; 36 | } 37 | 38 | dimension: attribute_relation { 39 | type: string 40 | sql: CONCAT(${attribute}, ' ', ${subject}) ;; 41 | } 42 | 43 | measure: attribute_sentiment_value { 44 | label: "Attribute Sentiment Value" 45 | type: average 46 | sql: ${sentiment_value_dimension} ;; 47 | value_format: "# ##0.0#" 48 | drill_fields: [detail*, attribute_sentiment_value] 49 | } 50 | 51 | measure: count { 52 | label: "Relations" 53 | type: count 54 | drill_fields: [detail*, subject, attribute, count] 55 | } 56 | 57 | # ----- Sets of fields for drilling ------ 58 | set: detail { 59 | fields: [ 60 | location.location, 61 | review.review_published_date, 62 | review.review_text_short, 63 | review.source, 64 | review.rating_stars, 65 | sentiment_label 66 | ] 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Voice of Customer by Keboola 2 | 3 | ## Keboola Blocks Intro (Scaffold Prerequisite) 4 | Looker Blocks powered by Keboola are designed to work in tandem with corresponding Keboola Scaffolds in the Keboola Connection platform. Similar to Blocks in nature, Keboola Scaffolds are templatized use-cases that can be instantly deployed into the Keboola platform, providing the whole data management and processing chain required to populate the Looker dashboards. 5 | 6 | ## Block Overview 7 | This Block connects to data from Keboola “Reviews - Looker” Scaffold into Looker. Its purpose is to provide a quick out-of-the-box end to end integration and functionality to be used either stand-alone or to be combined with other data, into scorecards, etc. In order to set up the Keboola data feed, please contact us: [here](https://get.keboola.com/lookerblocks?block=rt_hospitality). If you don’t have a ReviewTrackers account, you can set up a free trial [here](https://www.reviewtrackers.com/request-demo/?utm_source=keboola&utm_medium=affiliate&utm_campaign=trial_link). 8 | 9 | ## Data and Block Structure 10 | The block contains two LookML dashboards: 11 | * Ratings Overview for understanding the relative ratings, sentiment value, responsiveness and to highlight negative reviews for handling 12 | * NLP Analysis for deeper dive into the topics and their relative contribution to positive and negative feedback 13 | 14 | The underlying model is simple and there is just one explore - “reviews”. 15 | 16 | As a standard, the data gets provided as a connection to Keboola-provided Snowflake, but it can be easily changed to your own data warehouse of choice during the setup. 17 | 18 | ## Customization 19 | The LookML contents of this block can also be modified/extended to best fit all use cases. 20 | This block utilizes Refinement files for customization. For more information on using refinements to customize marketplace blocks, please see [this documentation](https://docs.looker.com/data-modeling/marketplace/customize-blocks). 21 | -------------------------------------------------------------------------------- /block_keboola_reviews_v2.model.lkml: -------------------------------------------------------------------------------- 1 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 2 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣠⣤⣤⣤⣤⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 3 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 4 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 5 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 6 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 7 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠛⠛⠛⠛⠛⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 8 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 9 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 10 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 11 | #⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀ 12 | #⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀ 13 | #⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀ 14 | #⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀ 15 | #⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀ 16 | #⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠻⣧⠀⠀⠀⠀⢀⡀⠀⠀⢀⡀⠀⠀⠀⢀⣼⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀ 17 | #⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠈⢧⡀⠀⠰⣿⣿⠆⠰⣿⣿⠆⠀⢀⡾⠁⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀ 18 | #⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠙⢦⡀⠈⠁⠀⠀⠈⠁⢀⡴⠋⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀ 19 | #⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠉⠓⠶⠤⠤⠶⠚⠉⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀ 20 | #⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡷⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀ 21 | #⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀ 22 | #⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⣠⡾⠀⠀⠀⣰⣦⠀⠀⠀⢷⣄⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀ 23 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢠⣾⣿⠁⠀⠀⣸⣿⣿⡆⠀⠀⠈⣿⣷⡄⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 24 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣿⡏⠀⠀⢀⣿⣿⣿⣿⡀⠀⠀⢹⣿⣿⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 25 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 26 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⣤⣾⣿⣿⣿⣿⣷⣤⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 27 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 28 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 29 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 30 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 31 | #⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 32 | 33 | 34 | # This Looker Block is designed to be powered by a scaffold in Keboola connection 35 | # that will acquire and transform data from ReviewTrackers into the model expected here. 36 | # Please go to https://get.keboola.com/lookerblocks if you haven't already. 37 | 38 | # The connection name can be changed in the manifest file if desired, along with 39 | # other constants used by this block (Keboola will automatically create a connection 40 | # with this name 41 | 42 | connection: "@{CONNECTION}" 43 | 44 | ## Include Explore 45 | include: "/explores/review.explore.lkml" 46 | ## Include Dashboards 47 | include: "/dashboards/voice_of_customer_nlp_analysis.dashboard.lookml" 48 | include: "/dashboards/voice_of_customer_nlp_topic_analysis.dashboard.lookml" 49 | include: "/dashboards/voice_of_customer_ratings_overview.dashboard.lookml" 50 | -------------------------------------------------------------------------------- /views/review.view.lkml: -------------------------------------------------------------------------------- 1 | view: review { 2 | sql_table_name: @{SCHEMA_NAME}.REVIEW ;; 3 | 4 | dimension: review_id { 5 | label: "Review ID" 6 | primary_key: yes 7 | type: string 8 | sql: ${TABLE}."REVIEW_ID" ;; 9 | } 10 | 11 | dimension: has_response { 12 | type: string 13 | sql: ${TABLE}."HAS_RESPONSE" ;; 14 | } 15 | 16 | dimension: location_id { 17 | type: string 18 | hidden: yes 19 | sql: ${TABLE}."LOCATION_ID" ;; 20 | } 21 | 22 | dimension_group: response_published { 23 | type: time 24 | timeframes: [ 25 | raw, 26 | date, 27 | week, 28 | month, 29 | quarter, 30 | year 31 | ] 32 | convert_tz: no 33 | sql: ${TABLE}."RESPONSE_PUBLISHED_AT" ;; 34 | } 35 | 36 | dimension_group: review_published { 37 | type: time 38 | timeframes: [ 39 | raw, 40 | date, 41 | week, 42 | month, 43 | quarter, 44 | year 45 | ] 46 | convert_tz: no 47 | sql: ${TABLE}."REVIEW_PUBLISHED_AT" ;; 48 | } 49 | 50 | dimension: review_text { 51 | type: string 52 | sql: ${TABLE}."REVIEW_TEXT" ;; 53 | } 54 | 55 | dimension: review_text_short { 56 | type: string 57 | sql: (CASE 58 | WHEN LENGTH(${review_text})>256 59 | THEN CONCAT(LEFT(${review_text},253), '...') 60 | ELSE ${review_text} 61 | END) ;; 62 | drill_fields: [detail*, review_text] 63 | } 64 | 65 | dimension: review_title { 66 | type: string 67 | sql: ${TABLE}."REVIEW_TITLE" ;; 68 | } 69 | 70 | dimension: response_text { 71 | type: string 72 | sql: ${TABLE}."RESPONSE_TEXT" ;; 73 | } 74 | 75 | dimension: response_text_short { 76 | type: string 77 | sql: (CASE 78 | WHEN LENGTH(${response_text})>256 79 | THEN CONCAT(LEFT(${response_text},253), '...') 80 | ELSE ${response_text}) 81 | END) ;; 82 | drill_fields: [detail*, review_text] 83 | } 84 | 85 | dimension: sentiment_label { 86 | label: "Review Sentiment Label" 87 | type: string 88 | sql: ${TABLE}."SENTIMENT_LABEL" ;; 89 | } 90 | 91 | dimension: source { 92 | type: string 93 | sql: ${TABLE}."SOURCE" ;; 94 | html: {{ value }} ;; 95 | } 96 | 97 | dimension: source_url { 98 | hidden: yes 99 | type: string 100 | sql: ${TABLE}."SOURCE_URL" ;; 101 | } 102 | 103 | dimension: sentiment_value_dimension { 104 | hidden: yes 105 | type: number 106 | sql: ${TABLE}."SENTIMENT_VALUE" ;; 107 | } 108 | 109 | dimension: review_text_length_dimension { 110 | hidden: yes 111 | type: number 112 | sql: ${TABLE}."REVIEW_TEXT_LENGTH" ;; 113 | } 114 | 115 | dimension: rating_dimension { 116 | label: "Rating" 117 | type: number 118 | sql: ${TABLE}."RATING" ;; 119 | } 120 | 121 | dimension: days_to_response_dimension { 122 | hidden: yes 123 | type: number 124 | sql: ${TABLE}."DAYS_TO_RESPONSE" ;; 125 | } 126 | 127 | measure: rating_value { 128 | type: average 129 | sql: ${rating_dimension} ;; 130 | value_format: "# ##0.0#" 131 | drill_fields: [detail*, rating_value] 132 | } 133 | 134 | measure: recent_rating { 135 | type: average 136 | sql: ${rating_dimension} ;; 137 | filters: { 138 | field: review_published_date 139 | value: "last 14 days" 140 | } 141 | view_label: "" 142 | value_format: "# ##0.0#" 143 | drill_fields: [detail*, recent_rating] 144 | } 145 | 146 | measure: old_rating { 147 | description: "14 days ago" 148 | type: average 149 | sql: ${rating_dimension} ;; 150 | filters: { 151 | field: review_published_date 152 | value: "before 14 days ago" 153 | } 154 | view_label: "" 155 | value_format: "# ##0.0#" 156 | drill_fields: [detail*, old_rating] 157 | } 158 | 159 | measure: rating_stars { 160 | type: average 161 | sql: ${rating_dimension} ;; 162 | view_label: "" 163 | html: 164 | {%if value > 0.5%} 165 | {%if value > 1.5%} 166 | {%if value > 2.5%} 167 | {%if value > 3.5%} 168 | {%if value > 4.5%} 169 | ✪ ✪ ✪ ✪ ✪ 170 | {%else%} 171 | ✪ ✪ ✪ ✪ 172 | {%endif%} 173 | {%else%} 174 | ✪ ✪ ✪ 175 | {%endif%} 176 | {%else%} 177 | ✪ ✪ 178 | {%endif%} 179 | {%else%} 180 | ✪ 181 | {%endif%} 182 | {%else%} 183 | 💩 184 | {%endif%};; 185 | } 186 | 187 | measure: sentiment_value { 188 | label: "Review Sentiment Value" 189 | type: average 190 | sql: ${sentiment_value_dimension} ;; 191 | value_format: "# ##0.0#" 192 | drill_fields: [detail*, sentiment_value] 193 | } 194 | 195 | measure: review_text_length { 196 | type: average 197 | sql: ${review_text_length_dimension} ;; 198 | } 199 | 200 | measure: days_to_response { 201 | type: average 202 | sql: ${days_to_response_dimension} ;; 203 | } 204 | 205 | measure: count { 206 | label: "Reviews" 207 | type: count 208 | drill_fields: [detail*, count] 209 | } 210 | 211 | measure: responded_reviews { 212 | type: count 213 | filters: { 214 | field: has_response 215 | value: "true" 216 | } 217 | drill_fields: [detail*, responded_reviews] 218 | } 219 | 220 | # ----- Sets of fields for drilling ------ 221 | set: detail { 222 | fields: [ 223 | location.location, 224 | review_published_date, 225 | source, 226 | review_text_short, 227 | response_text_short, 228 | rating_stars, 229 | sentiment_label 230 | ] 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /dashboards/voice_of_customer_nlp_topic_analysis.dashboard.lookml: -------------------------------------------------------------------------------- 1 | - dashboard: voc__nlp_topic_analysis 2 | title: VoC - NLP Topic Analysis 3 | layout: newspaper 4 | elements: 5 | - name: '' 6 | type: text 7 | subtitle_text: Voice of Customer 8 | row: 0 9 | col: 0 10 | width: 7 11 | height: 2 12 | - name: " (2)" 13 | type: text 14 | subtitle_text: NLP Topic Analysis 15 | row: 0 16 | col: 7 17 | width: 11 18 | height: 2 19 | - name: " (3)" 20 | type: text 21 | title_text: '' 22 | body_text: 24 | row: 0 25 | col: 18 26 | width: 6 27 | height: 2 28 | - title: Top Subjects Sentiment Share in Topic Related Reviews 29 | name: Top Subjects Sentiment Share in Topic Related Reviews 30 | model: block_keboola_reviews_v2 31 | explore: review 32 | type: looker_bar 33 | fields: [attribute_relation.sentiment_label, attribute_relation.count, attribute_relation.subject] 34 | pivots: [attribute_relation.sentiment_label] 35 | filters: 36 | attribute_relation.sentiment_label: "-NULL" 37 | sorts: [attribute_relation.count desc 3, attribute_relation.sentiment_label 0] 38 | limit: 10 39 | row_total: right 40 | x_axis_gridlines: false 41 | y_axis_gridlines: true 42 | show_view_names: false 43 | show_y_axis_labels: true 44 | show_y_axis_ticks: true 45 | y_axis_tick_density: default 46 | y_axis_tick_density_custom: 5 47 | show_x_axis_label: false 48 | show_x_axis_ticks: true 49 | y_axis_scale_mode: linear 50 | x_axis_reversed: false 51 | y_axis_reversed: false 52 | plot_size_by_field: false 53 | trellis: '' 54 | stacking: normal 55 | limit_displayed_rows: false 56 | legend_position: center 57 | point_style: none 58 | show_value_labels: false 59 | label_density: 25 60 | x_axis_scale: auto 61 | y_axis_combined: true 62 | ordering: none 63 | show_null_labels: false 64 | show_totals_labels: false 65 | show_silhouette: false 66 | totals_color: "#808080" 67 | color_application: 68 | collection_id: legacy 69 | palette_id: santa_cruz 70 | options: 71 | steps: 5 72 | series_types: {} 73 | series_colors: 74 | attribute_relation.count: "#ed6168" 75 | hierarchy_relation.count: "#e9b404" 76 | negative - attribute_relation.count: "#ed6168" 77 | neutral - attribute_relation.count: "#e9b404" 78 | positive - attribute_relation.count: "#49cec1" 79 | hidden_fields: [] 80 | defaults_version: 1 81 | listen: 82 | Date: review.review_published_date 83 | Location: location.location 84 | Source: review.source 85 | Topic object: hierarchy_relation.object 86 | row: 2 87 | col: 17 88 | width: 7 89 | height: 10 90 | - title: Review Related to Topic 91 | name: Review Related to Topic 92 | model: block_keboola_reviews_v2 93 | explore: review 94 | type: single_value 95 | fields: [review.count] 96 | limit: 500 97 | custom_color_enabled: true 98 | show_single_value_title: true 99 | show_comparison: false 100 | comparison_type: value 101 | comparison_reverse_colors: false 102 | show_comparison_label: true 103 | enable_conditional_formatting: false 104 | conditional_formatting_include_totals: false 105 | conditional_formatting_include_nulls: false 106 | series_types: {} 107 | defaults_version: 1 108 | listen: 109 | Date: review.review_published_date 110 | Location: location.location 111 | Source: review.source 112 | Topic object: hierarchy_relation.object 113 | row: 2 114 | col: 6 115 | width: 3 116 | height: 5 117 | - title: Rating of Reviews Related to Topic 118 | name: Rating of Reviews Related to Topic 119 | model: block_keboola_reviews_v2 120 | explore: review 121 | type: single_value 122 | fields: [review.rating_stars] 123 | limit: 500 124 | custom_color_enabled: true 125 | show_single_value_title: true 126 | show_comparison: false 127 | comparison_type: value 128 | comparison_reverse_colors: false 129 | show_comparison_label: true 130 | enable_conditional_formatting: false 131 | conditional_formatting_include_totals: false 132 | conditional_formatting_include_nulls: false 133 | series_types: {} 134 | defaults_version: 1 135 | listen: 136 | Date: review.review_published_date 137 | Location: location.location 138 | Source: review.source 139 | Topic object: hierarchy_relation.object 140 | row: 7 141 | col: 6 142 | width: 3 143 | height: 5 144 | - title: Most Mentioned Attribute Relations of the Topic 145 | name: Most Mentioned Attribute Relations of the Topic 146 | model: block_keboola_reviews_v2 147 | explore: review 148 | type: looker_wordcloud 149 | fields: [attribute_relation.count, attribute_relation.attribute_relation] 150 | limit: 20 151 | color_application: undefined 152 | series_types: {} 153 | defaults_version: 1 154 | listen: 155 | Date: review.review_published_date 156 | Location: location.location 157 | Source: review.source 158 | Topic object: hierarchy_relation.object 159 | row: 12 160 | col: 0 161 | width: 8 162 | height: 8 163 | - title: Last Reviews Related to the Topic 164 | name: Last Reviews Related to the Topic 165 | model: block_keboola_reviews_v2 166 | explore: review 167 | type: looker_grid 168 | fields: [review.review_published_date, review.review_title, review.review_text_short, 169 | review.source, review.rating_stars] 170 | sorts: [review.review_published_date desc] 171 | limit: 100 172 | show_view_names: false 173 | show_row_numbers: true 174 | transpose: false 175 | truncate_text: true 176 | hide_totals: false 177 | hide_row_totals: false 178 | size_to_fit: true 179 | table_theme: gray 180 | limit_displayed_rows: false 181 | enable_conditional_formatting: false 182 | header_text_alignment: left 183 | header_font_size: '12' 184 | rows_font_size: '12' 185 | conditional_formatting_include_totals: false 186 | conditional_formatting_include_nulls: false 187 | color_application: undefined 188 | show_sql_query_menu_options: false 189 | show_totals: true 190 | show_row_totals: true 191 | series_cell_visualizations: 192 | review.rating_stars: 193 | is_active: false 194 | series_types: {} 195 | defaults_version: 1 196 | listen: 197 | Date: review.review_published_date 198 | Location: location.location 199 | Source: review.source 200 | Topic object: hierarchy_relation.object 201 | row: 12 202 | col: 8 203 | width: 16 204 | height: 8 205 | - title: Entities Related to Topic Object 206 | name: Entities Related to Topic Object 207 | model: block_keboola_reviews_v2 208 | explore: review 209 | type: looker_pie 210 | fields: [review.count, hierarchy_relation.entity] 211 | filters: 212 | hierarchy_relation.entity: "-NULL" 213 | sorts: [review.count desc] 214 | limit: 50 215 | column_limit: 50 216 | row_total: right 217 | value_labels: legend 218 | label_type: labPer 219 | color_application: 220 | collection_id: legacy 221 | custom: 222 | id: 0ad3f6a4-4c76-5f66-b50c-49e7832c52f4 223 | label: Custom 224 | type: continuous 225 | stops: 226 | - color: "#EA626A" 227 | offset: 0 228 | - color: "#E7B32A" 229 | offset: 50 230 | - color: "#50CEC0" 231 | offset: 100 232 | options: 233 | steps: 5 234 | series_colors: {} 235 | x_axis_gridlines: false 236 | y_axis_gridlines: true 237 | show_view_names: false 238 | y_axes: [{label: '', orientation: bottom, series: [{axisId: negative - review.count, 239 | id: negative - review.count, name: negative}, {axisId: neutral - review.count, 240 | id: neutral - review.count, name: neutral}, {axisId: positive - review.count, 241 | id: positive - review.count, name: positive}], showLabels: false, showValues: true, 242 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 243 | show_y_axis_labels: true 244 | show_y_axis_ticks: true 245 | y_axis_tick_density: default 246 | y_axis_tick_density_custom: 5 247 | show_x_axis_label: false 248 | show_x_axis_ticks: true 249 | y_axis_scale_mode: linear 250 | x_axis_reversed: false 251 | y_axis_reversed: false 252 | plot_size_by_field: false 253 | trellis: '' 254 | stacking: normal 255 | limit_displayed_rows: false 256 | legend_position: center 257 | series_types: {} 258 | point_style: none 259 | show_value_labels: false 260 | label_density: 25 261 | x_axis_scale: auto 262 | y_axis_combined: true 263 | ordering: none 264 | show_null_labels: false 265 | show_totals_labels: false 266 | show_silhouette: false 267 | totals_color: "#808080" 268 | defaults_version: 1 269 | listen: 270 | Date: review.review_published_date 271 | Location: location.location 272 | Source: review.source 273 | Topic object: hierarchy_relation.object 274 | row: 2 275 | col: 0 276 | width: 6 277 | height: 10 278 | - title: Topic Related Reviews by Location and Rating 279 | name: Topic Related Reviews by Location and Rating 280 | model: block_keboola_reviews_v2 281 | explore: review 282 | type: looker_bar 283 | fields: [review.count, location.location, review.rating_dimension] 284 | pivots: [review.rating_dimension] 285 | filters: 286 | entity.sentiment_label: "-NULL" 287 | sorts: [review.count desc 0, review.rating_dimension] 288 | limit: 10 289 | column_limit: 50 290 | row_total: right 291 | x_axis_gridlines: false 292 | y_axis_gridlines: true 293 | show_view_names: false 294 | show_y_axis_labels: true 295 | show_y_axis_ticks: true 296 | y_axis_tick_density: default 297 | y_axis_tick_density_custom: 5 298 | show_x_axis_label: false 299 | show_x_axis_ticks: true 300 | y_axis_scale_mode: linear 301 | x_axis_reversed: false 302 | y_axis_reversed: false 303 | plot_size_by_field: false 304 | trellis: '' 305 | stacking: normal 306 | limit_displayed_rows: false 307 | legend_position: center 308 | point_style: none 309 | show_value_labels: false 310 | label_density: 25 311 | x_axis_scale: auto 312 | y_axis_combined: true 313 | ordering: none 314 | show_null_labels: false 315 | show_totals_labels: false 316 | show_silhouette: false 317 | totals_color: "#808080" 318 | color_application: 319 | collection_id: legacy 320 | custom: 321 | id: e7d47a54-fea4-594d-4151-c8b051066ddd 322 | label: Custom 323 | type: continuous 324 | stops: 325 | - color: "#EA626A" 326 | offset: 0 327 | - color: "#E7B32A" 328 | offset: 50 329 | - color: "#50CEC0" 330 | offset: 100 331 | options: 332 | steps: 5 333 | y_axes: [{label: '', orientation: bottom, series: [{axisId: negative - review.count, 334 | id: negative - review.count, name: negative}, {axisId: neutral - review.count, 335 | id: neutral - review.count, name: neutral}, {axisId: positive - review.count, 336 | id: positive - review.count, name: positive}], showLabels: false, showValues: true, 337 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 338 | series_types: {} 339 | series_colors: {} 340 | defaults_version: 1 341 | listen: 342 | Date: review.review_published_date 343 | Location: location.location 344 | Source: review.source 345 | Topic object: hierarchy_relation.object 346 | row: 2 347 | col: 9 348 | width: 8 349 | height: 10 350 | filters: 351 | - name: Date 352 | title: Date 353 | type: date_filter 354 | default_value: 6 months 355 | allow_multiple_values: true 356 | required: false 357 | - name: Location 358 | title: Location 359 | type: field_filter 360 | default_value: '' 361 | allow_multiple_values: true 362 | required: false 363 | model: block_keboola_reviews_v2 364 | explore: review 365 | listens_to_filters: [] 366 | field: location.location 367 | - name: Source 368 | title: Source 369 | type: field_filter 370 | default_value: '' 371 | allow_multiple_values: true 372 | required: false 373 | model: block_keboola_reviews_v2 374 | explore: review 375 | listens_to_filters: [] 376 | field: review.source 377 | - name: Topic object 378 | title: Topic object 379 | type: field_filter 380 | default_value: '' 381 | allow_multiple_values: true 382 | required: true 383 | model: block_keboola_reviews_v2 384 | explore: review 385 | listens_to_filters: [] 386 | field: hierarchy_relation.object -------------------------------------------------------------------------------- /dashboards/voice_of_customer_ratings_overview.dashboard.lookml: -------------------------------------------------------------------------------- 1 | - dashboard: voc__rating_overview 2 | title: VoC - Rating Overview 3 | layout: newspaper 4 | elements: 5 | - title: Average Rating KPI 6 | name: Average Rating KPI 7 | model: block_keboola_reviews_v2 8 | explore: review 9 | type: single_value 10 | fields: [review.rating_stars] 11 | limit: 500 12 | custom_color_enabled: true 13 | show_single_value_title: false 14 | show_comparison: false 15 | comparison_type: value 16 | comparison_reverse_colors: false 17 | show_comparison_label: true 18 | enable_conditional_formatting: false 19 | conditional_formatting_include_totals: false 20 | conditional_formatting_include_nulls: false 21 | series_types: {} 22 | listen: 23 | Date: review.review_published_date 24 | Location: location.location 25 | Source: review.source 26 | row: 2 27 | col: 0 28 | width: 4 29 | height: 2 30 | - title: Average Rating Overall 31 | name: Average Rating Overall 32 | model: block_keboola_reviews_v2 33 | explore: review 34 | type: single_value 35 | fields: [review.rating_value, review.old_rating] 36 | limit: 500 37 | dynamic_fields: [{table_calculation: change, label: Change, expression: "(${review.rating_value}-${review.old_rating})/${review.old_rating}", 38 | value_format: !!null '', value_format_name: percent_1, _kind_hint: measure, 39 | _type_hint: number}] 40 | custom_color_enabled: true 41 | show_single_value_title: true 42 | show_comparison: true 43 | comparison_type: change 44 | comparison_reverse_colors: false 45 | show_comparison_label: true 46 | enable_conditional_formatting: false 47 | conditional_formatting_include_totals: false 48 | conditional_formatting_include_nulls: false 49 | hidden_fields: [review.old_rating] 50 | series_types: {} 51 | listen: 52 | Date: review.review_published_date 53 | Location: location.location 54 | Source: review.source 55 | row: 4 56 | col: 0 57 | width: 4 58 | height: 4 59 | - title: Reviews 60 | name: Reviews 61 | model: block_keboola_reviews_v2 62 | explore: review 63 | type: single_value 64 | fields: [review.count] 65 | limit: 500 66 | listen: 67 | Date: review.review_published_date 68 | Location: location.location 69 | Source: review.source 70 | row: 8 71 | col: 0 72 | width: 4 73 | height: 2 74 | - title: Reviews w/ Response 75 | name: Reviews w/ Response 76 | model: block_keboola_reviews_v2 77 | explore: review 78 | type: single_value 79 | fields: [review.count, review.responded_reviews] 80 | limit: 500 81 | dynamic_fields: [{table_calculation: reviews_w_response, label: Reviews w/ Response, 82 | expression: "${review.responded_reviews}/${review.count}", value_format: !!null '', 83 | value_format_name: percent_1, _kind_hint: measure, _type_hint: number}] 84 | hidden_fields: [review.count, review.responded_reviews] 85 | series_types: {} 86 | listen: 87 | Date: review.review_published_date 88 | Location: location.location 89 | Source: review.source 90 | row: 10 91 | col: 0 92 | width: 4 93 | height: 2 94 | - title: Number of Locations 95 | name: Number of Locations 96 | model: block_keboola_reviews_v2 97 | explore: review 98 | type: single_value 99 | fields: [location.count] 100 | limit: 500 101 | listen: 102 | Location: location.location 103 | Source: review.source 104 | row: 12 105 | col: 0 106 | width: 4 107 | height: 2 108 | - title: Locations Ratings 109 | name: Locations Ratings 110 | model: block_keboola_reviews_v2 111 | explore: review 112 | type: looker_map 113 | fields: [location.location_gps, review.rating_value, location.location] 114 | sorts: [review.rating_value desc] 115 | limit: 500 116 | map_plot_mode: points 117 | heatmap_gridlines: false 118 | heatmap_gridlines_empty: false 119 | heatmap_opacity: 0.5 120 | show_region_field: true 121 | draw_map_labels_above_data: true 122 | map_tile_provider: light 123 | map_position: fit_data 124 | map_scale_indicator: 'off' 125 | map_pannable: true 126 | map_zoomable: true 127 | map_marker_type: icon 128 | map_marker_icon_name: restaurant 129 | map_marker_radius_mode: proportional_value 130 | map_marker_units: meters 131 | map_marker_proportional_scale_type: linear 132 | map_marker_color_mode: value 133 | show_view_names: false 134 | show_legend: true 135 | quantize_map_value_colors: false 136 | reverse_map_value_colors: true 137 | map_value_scale_clamp_min: 1 138 | map_value_scale_clamp_max: 5 139 | series_types: {} 140 | listen: 141 | Date: review.review_published_date 142 | Location: location.location 143 | Source: review.source 144 | row: 8 145 | col: 4 146 | width: 8 147 | height: 6 148 | - title: Reviews & Average Sentiment Last 12 Weeks 149 | name: Reviews & Average Sentiment Last 12 Weeks 150 | model: block_keboola_reviews_v2 151 | explore: review 152 | type: looker_line 153 | fields: [review.review_published_week, review.sentiment_value, review.count] 154 | fill_fields: [review.review_published_week] 155 | filters: 156 | review.review_published_week: 12 weeks 157 | sorts: [review.review_published_week desc] 158 | limit: 500 159 | color_application: 160 | collection_id: legacy 161 | palette_id: santa_cruz 162 | options: 163 | steps: 5 164 | x_axis_gridlines: false 165 | y_axis_gridlines: true 166 | show_view_names: false 167 | y_axes: [{label: '', orientation: left, series: [{axisId: review.sentiment_value, 168 | id: review.sentiment_value, name: Review Sentiment Value}], showLabels: true, 169 | showValues: true, unpinAxis: false, tickDensity: default, type: linear}, { 170 | label: !!null '', orientation: right, series: [{axisId: review.count, id: review.count, 171 | name: Reviews}], showLabels: true, showValues: true, unpinAxis: false, 172 | tickDensity: default, type: linear}] 173 | show_y_axis_labels: true 174 | show_y_axis_ticks: true 175 | y_axis_tick_density: default 176 | y_axis_tick_density_custom: 5 177 | show_x_axis_label: false 178 | show_x_axis_ticks: true 179 | y_axis_scale_mode: linear 180 | x_axis_reversed: false 181 | y_axis_reversed: false 182 | plot_size_by_field: false 183 | trellis: '' 184 | stacking: '' 185 | limit_displayed_rows: false 186 | hide_legend: true 187 | legend_position: center 188 | series_types: 189 | review.count: area 190 | point_style: none 191 | series_colors: 192 | review.count: "#1ea8df" 193 | review.sentiment_value: "#353b49" 194 | show_value_labels: false 195 | label_density: 25 196 | x_axis_scale: auto 197 | y_axis_combined: true 198 | show_null_points: true 199 | interpolation: linear 200 | listen: 201 | Location: location.location 202 | Source: review.source 203 | row: 2 204 | col: 12 205 | width: 12 206 | height: 6 207 | - title: Bad Reviews in Last 14 Days 208 | name: Bad Reviews in Last 14 Days 209 | model: block_keboola_reviews_v2 210 | explore: review 211 | type: table 212 | fields: [location.location, review.source, review.review_published_date, review.review_text_short, 213 | review.rating_stars, review.sentiment_value] 214 | filters: 215 | review.review_published_date: 14 days 216 | review.rating_value: "<4" 217 | sorts: [review.review_published_date desc] 218 | limit: 500 219 | show_view_names: false 220 | show_row_numbers: true 221 | truncate_column_names: false 222 | hide_totals: false 223 | hide_row_totals: false 224 | table_theme: gray 225 | limit_displayed_rows: false 226 | enable_conditional_formatting: false 227 | conditional_formatting_include_totals: false 228 | conditional_formatting_include_nulls: false 229 | series_types: {} 230 | listen: 231 | Location: location.location 232 | Source: review.source 233 | row: 14 234 | col: 12 235 | width: 12 236 | height: 6 237 | - name: '' 238 | type: text 239 | title_text: '' 240 | subtitle_text: Voice of Customer 241 | body_text: '' 242 | row: 0 243 | col: 0 244 | width: 7 245 | height: 2 246 | - name: " (2)" 247 | type: text 248 | title_text: '' 249 | subtitle_text: Overview 250 | body_text: '' 251 | row: 0 252 | col: 7 253 | width: 11 254 | height: 2 255 | - name: " (3)" 256 | type: text 257 | body_text: 259 | row: 0 260 | col: 18 261 | width: 6 262 | height: 2 263 | - title: Reviews by Rating 264 | name: Reviews by Rating 265 | model: block_keboola_reviews_v2 266 | explore: review 267 | type: looker_column 268 | fields: [review.count, review.rating_dimension] 269 | pivots: [review.rating_dimension] 270 | sorts: [review.rating_dimension] 271 | limit: 500 272 | x_axis_gridlines: false 273 | y_axis_gridlines: true 274 | show_view_names: false 275 | show_y_axis_labels: true 276 | show_y_axis_ticks: true 277 | y_axis_tick_density: default 278 | y_axis_tick_density_custom: 5 279 | show_x_axis_label: false 280 | show_x_axis_ticks: true 281 | y_axis_scale_mode: linear 282 | x_axis_reversed: false 283 | y_axis_reversed: false 284 | plot_size_by_field: false 285 | trellis: '' 286 | stacking: '' 287 | limit_displayed_rows: false 288 | legend_position: center 289 | point_style: none 290 | show_value_labels: true 291 | label_density: 25 292 | x_axis_scale: auto 293 | y_axis_combined: true 294 | ordering: none 295 | show_null_labels: false 296 | show_totals_labels: false 297 | show_silhouette: false 298 | totals_color: "#808080" 299 | color_application: 300 | collection_id: legacy 301 | custom: 302 | id: 66de995f-921b-d63d-1671-7157b8b98479 303 | label: Custom 304 | type: continuous 305 | stops: 306 | - color: "#EA626A" 307 | offset: 0 308 | - color: "#e7b32a" 309 | offset: 50 310 | - color: "#50cec0" 311 | offset: 100 312 | options: 313 | steps: 5 314 | y_axes: [{label: '', orientation: left, series: [{axisId: review.count, id: 1 315 | - review.count, name: '1'}, {axisId: review.count, id: 2 - review.count, 316 | name: '2'}, {axisId: review.count, id: 3 - review.count, name: '3'}, { 317 | axisId: review.count, id: 4 - review.count, name: '4'}, {axisId: review.count, 318 | id: 5 - review.count, name: '5'}], showLabels: false, showValues: true, 319 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 320 | series_types: {} 321 | series_colors: {} 322 | defaults_version: 1 323 | listen: 324 | Date: review.review_published_date 325 | Location: location.location 326 | Source: review.source 327 | row: 2 328 | col: 4 329 | width: 8 330 | height: 6 331 | - title: Reviews by Rating Last 12 Weeks 332 | name: Reviews by Rating Last 12 Weeks 333 | model: block_keboola_reviews_v2 334 | explore: review 335 | type: looker_column 336 | fields: [review.count, review.rating_dimension, review.review_published_week] 337 | pivots: [review.rating_dimension] 338 | fill_fields: [review.review_published_week] 339 | filters: 340 | review.review_published_week: 12 weeks 341 | sorts: [review.rating_dimension, review.review_published_week desc] 342 | limit: 500 343 | x_axis_gridlines: false 344 | y_axis_gridlines: true 345 | show_view_names: false 346 | show_y_axis_labels: true 347 | show_y_axis_ticks: true 348 | y_axis_tick_density: default 349 | y_axis_tick_density_custom: 5 350 | show_x_axis_label: false 351 | show_x_axis_ticks: true 352 | y_axis_scale_mode: linear 353 | x_axis_reversed: false 354 | y_axis_reversed: false 355 | plot_size_by_field: false 356 | trellis: '' 357 | stacking: normal 358 | limit_displayed_rows: false 359 | legend_position: center 360 | point_style: none 361 | show_value_labels: false 362 | label_density: 25 363 | x_axis_scale: auto 364 | y_axis_combined: true 365 | ordering: none 366 | show_null_labels: false 367 | show_totals_labels: false 368 | show_silhouette: false 369 | totals_color: "#808080" 370 | color_application: 371 | collection_id: legacy 372 | custom: 373 | id: 15847ce1-c818-7424-6488-817227eee916 374 | label: Custom 375 | type: continuous 376 | stops: 377 | - color: "#ea626a" 378 | offset: 0 379 | - color: "#e7b32a" 380 | offset: 50 381 | - color: "#50cec0" 382 | offset: 100 383 | options: 384 | steps: 5 385 | y_axes: [{label: '', orientation: left, series: [{axisId: review.count, id: 1 386 | - review.count, name: '1'}, {axisId: review.count, id: 2 - review.count, 387 | name: '2'}, {axisId: review.count, id: 3 - review.count, name: '3'}, { 388 | axisId: review.count, id: 4 - review.count, name: '4'}, {axisId: review.count, 389 | id: 5 - review.count, name: '5'}], showLabels: false, showValues: true, 390 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 391 | series_types: {} 392 | series_colors: {} 393 | defaults_version: 1 394 | listen: 395 | Location: location.location 396 | Source: review.source 397 | row: 8 398 | col: 12 399 | width: 12 400 | height: 6 401 | - title: Last 14 Days vs Overall Rating 402 | name: Last 14 Days vs Overall Rating 403 | model: block_keboola_reviews_v2 404 | explore: review 405 | type: looker_bar 406 | fields: [location.location, review.recent_rating, review.rating_value] 407 | sorts: [review.recent_rating desc] 408 | limit: 500 409 | x_axis_gridlines: false 410 | y_axis_gridlines: true 411 | show_view_names: false 412 | show_y_axis_labels: true 413 | show_y_axis_ticks: true 414 | y_axis_tick_density: default 415 | y_axis_tick_density_custom: 5 416 | show_x_axis_label: false 417 | show_x_axis_ticks: true 418 | y_axis_scale_mode: linear 419 | x_axis_reversed: false 420 | y_axis_reversed: false 421 | plot_size_by_field: false 422 | trellis: '' 423 | stacking: '' 424 | limit_displayed_rows: false 425 | legend_position: center 426 | point_style: none 427 | show_value_labels: true 428 | label_density: 25 429 | x_axis_scale: auto 430 | y_axis_combined: true 431 | ordering: none 432 | show_null_labels: false 433 | show_totals_labels: false 434 | show_silhouette: false 435 | totals_color: "#808080" 436 | color_application: 437 | collection_id: legacy 438 | palette_id: santa_cruz 439 | options: 440 | steps: 5 441 | y_axes: [{label: '', orientation: bottom, series: [{axisId: review.recent_rating, 442 | id: review.recent_rating, name: Recent Rating}, {axisId: review.rating_value, 443 | id: review.rating_value, name: Rating Value}], showLabels: false, showValues: false, 444 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 445 | series_types: {} 446 | series_colors: 447 | review.recent_rating: "#1ea8df" 448 | review.rating_value: "#353b49" 449 | series_labels: 450 | review.rating_value: Overall Rating 451 | defaults_version: 1 452 | listen: 453 | Date: review.review_published_date 454 | Location: location.location 455 | Source: review.source 456 | row: 14 457 | col: 0 458 | width: 12 459 | height: 6 460 | filters: 461 | - name: Date 462 | title: Date 463 | type: date_filter 464 | default_value: 6 months 465 | allow_multiple_values: true 466 | required: false 467 | - name: Location 468 | title: Location 469 | type: field_filter 470 | default_value: '' 471 | allow_multiple_values: true 472 | required: false 473 | model: block_keboola_reviews_v2 474 | explore: review 475 | listens_to_filters: [] 476 | field: location.location 477 | - name: Source 478 | title: Source 479 | type: field_filter 480 | default_value: '' 481 | allow_multiple_values: true 482 | required: false 483 | model: block_keboola_reviews_v2 484 | explore: review 485 | listens_to_filters: [] 486 | field: review.source -------------------------------------------------------------------------------- /dashboards/voice_of_customer_nlp_analysis.dashboard.lookml: -------------------------------------------------------------------------------- 1 | - dashboard: voc__nlp_analysis 2 | title: VoC - NLP Analysis 3 | layout: newspaper 4 | elements: 5 | - title: Rating 5 6 | name: Rating 5 7 | model: block_keboola_reviews_v2 8 | explore: review 9 | type: table 10 | fields: [attribute_relation.subject, review.count] 11 | filters: 12 | review.rating_dimension: '5' 13 | attribute_relation.subject: "-NULL" 14 | sorts: [review.count desc] 15 | limit: 10 16 | show_view_names: false 17 | show_row_numbers: true 18 | truncate_column_names: false 19 | hide_totals: false 20 | hide_row_totals: false 21 | table_theme: gray 22 | limit_displayed_rows: false 23 | enable_conditional_formatting: false 24 | conditional_formatting_include_totals: false 25 | conditional_formatting_include_nulls: false 26 | series_types: {} 27 | listen: 28 | Date: review.review_published_date 29 | Location: location.location 30 | Source: review.source 31 | row: 22 32 | col: 4 33 | width: 4 34 | height: 6 35 | - name: Most Mentioned Subjects by Rating 36 | type: text 37 | title_text: Most Mentioned Subjects by Rating 38 | row: 20 39 | col: 4 40 | width: 20 41 | height: 2 42 | - title: Most Mentioned Entities 43 | name: Most Mentioned Entities 44 | model: block_keboola_reviews_v2 45 | explore: review 46 | type: looker_wordcloud 47 | fields: [entity.entity, entity.count] 48 | limit: 20 49 | series_types: {} 50 | listen: 51 | Date: review.review_published_date 52 | Location: location.location 53 | Source: review.source 54 | row: 14 55 | col: 0 56 | width: 10 57 | height: 6 58 | - title: Average Sentiment 59 | name: Average Sentiment 60 | model: block_keboola_reviews_v2 61 | explore: review 62 | type: looker_line 63 | fields: [review.sentiment_value, review.review_published_week] 64 | filters: 65 | review.sentiment_value: NOT NULL 66 | sorts: [review.review_published_week desc] 67 | limit: 500 68 | color_application: 69 | collection_id: legacy 70 | palette_id: santa_cruz 71 | options: 72 | steps: 5 73 | x_axis_gridlines: false 74 | y_axis_gridlines: true 75 | show_view_names: false 76 | y_axes: [{label: '', orientation: left, series: [{axisId: review.sentiment_value, 77 | id: review.sentiment_value, name: Review Sentiment Value}], showLabels: false, 78 | showValues: true, unpinAxis: false, tickDensity: default, tickDensityCustom: 5, 79 | type: linear}] 80 | show_y_axis_labels: true 81 | show_y_axis_ticks: true 82 | y_axis_tick_density: default 83 | y_axis_tick_density_custom: 5 84 | show_x_axis_label: false 85 | show_x_axis_ticks: true 86 | y_axis_scale_mode: linear 87 | x_axis_reversed: false 88 | y_axis_reversed: false 89 | plot_size_by_field: false 90 | trellis: '' 91 | stacking: '' 92 | limit_displayed_rows: false 93 | legend_position: center 94 | series_types: {} 95 | point_style: none 96 | series_colors: 97 | review.sentiment_value: "#353b49" 98 | show_value_labels: false 99 | label_density: 25 100 | x_axis_scale: auto 101 | y_axis_combined: true 102 | reference_lines: [{reference_type: line, line_value: mean, range_start: max, range_end: min, 103 | margin_top: deviation, margin_value: mean, margin_bottom: deviation, label_position: right, 104 | color: "#000000"}] 105 | show_null_points: true 106 | interpolation: linear 107 | listen: 108 | Date: review.review_published_date 109 | Location: location.location 110 | Source: review.source 111 | row: 22 112 | col: 0 113 | width: 4 114 | height: 6 115 | - title: Rating 4 116 | name: Rating 4 117 | model: block_keboola_reviews_v2 118 | explore: review 119 | type: table 120 | fields: [attribute_relation.subject, review.count] 121 | filters: 122 | review.rating_dimension: '4' 123 | attribute_relation.subject: "-NULL" 124 | sorts: [review.count desc] 125 | limit: 10 126 | show_view_names: false 127 | show_row_numbers: true 128 | truncate_column_names: false 129 | hide_totals: false 130 | hide_row_totals: false 131 | table_theme: gray 132 | limit_displayed_rows: false 133 | enable_conditional_formatting: false 134 | conditional_formatting_include_totals: false 135 | conditional_formatting_include_nulls: false 136 | series_types: {} 137 | listen: 138 | Date: review.review_published_date 139 | Location: location.location 140 | Source: review.source 141 | row: 22 142 | col: 8 143 | width: 4 144 | height: 6 145 | - title: Rating 3 146 | name: Rating 3 147 | model: block_keboola_reviews_v2 148 | explore: review 149 | type: table 150 | fields: [attribute_relation.subject, review.count] 151 | filters: 152 | review.rating_dimension: '3' 153 | attribute_relation.subject: "-NULL" 154 | sorts: [review.count desc] 155 | limit: 10 156 | show_view_names: false 157 | show_row_numbers: true 158 | truncate_column_names: false 159 | hide_totals: false 160 | hide_row_totals: false 161 | table_theme: gray 162 | limit_displayed_rows: false 163 | enable_conditional_formatting: false 164 | conditional_formatting_include_totals: false 165 | conditional_formatting_include_nulls: false 166 | series_types: {} 167 | listen: 168 | Date: review.review_published_date 169 | Location: location.location 170 | Source: review.source 171 | row: 22 172 | col: 12 173 | width: 4 174 | height: 6 175 | - title: Rating 2 176 | name: Rating 2 177 | model: block_keboola_reviews_v2 178 | explore: review 179 | type: table 180 | fields: [attribute_relation.subject, review.count] 181 | filters: 182 | review.rating_dimension: '2' 183 | attribute_relation.subject: "-NULL" 184 | sorts: [review.count desc] 185 | limit: 10 186 | show_view_names: false 187 | show_row_numbers: true 188 | truncate_column_names: false 189 | hide_totals: false 190 | hide_row_totals: false 191 | table_theme: gray 192 | limit_displayed_rows: false 193 | enable_conditional_formatting: false 194 | conditional_formatting_include_totals: false 195 | conditional_formatting_include_nulls: false 196 | series_types: {} 197 | listen: 198 | Date: review.review_published_date 199 | Location: location.location 200 | Source: review.source 201 | row: 22 202 | col: 16 203 | width: 4 204 | height: 6 205 | - title: Rating 1 206 | name: Rating 1 207 | model: block_keboola_reviews_v2 208 | explore: review 209 | type: table 210 | fields: [attribute_relation.subject, review.count] 211 | filters: 212 | review.rating_dimension: '1' 213 | attribute_relation.subject: "-NULL" 214 | sorts: [review.count desc] 215 | limit: 10 216 | show_view_names: false 217 | show_row_numbers: true 218 | truncate_column_names: false 219 | hide_totals: false 220 | hide_row_totals: false 221 | table_theme: gray 222 | limit_displayed_rows: false 223 | enable_conditional_formatting: false 224 | conditional_formatting_include_totals: false 225 | conditional_formatting_include_nulls: false 226 | series_types: {} 227 | listen: 228 | Date: review.review_published_date 229 | Location: location.location 230 | Source: review.source 231 | row: 22 232 | col: 20 233 | width: 4 234 | height: 6 235 | - name: Sentiment KPI 236 | type: text 237 | title_text: Sentiment KPI 238 | row: 20 239 | col: 0 240 | width: 4 241 | height: 2 242 | - name: '' 243 | type: text 244 | subtitle_text: Voice of Customer 245 | row: 0 246 | col: 0 247 | width: 7 248 | height: 2 249 | - name: " (2)" 250 | type: text 251 | subtitle_text: NLP Analysis 252 | row: 0 253 | col: 7 254 | width: 11 255 | height: 2 256 | - name: " (3)" 257 | type: text 258 | title_text: '' 259 | body_text: 261 | row: 0 262 | col: 18 263 | width: 6 264 | height: 2 265 | - title: Top 10 Entities Sentiment 266 | name: Top 10 Entities Sentiment 267 | model: block_keboola_reviews_v2 268 | explore: review 269 | type: looker_bar 270 | fields: [entity.entity, review.count, entity.sentiment_label] 271 | pivots: [entity.sentiment_label] 272 | filters: 273 | entity.entity: "-NULL" 274 | sorts: [review.count desc 3, entity.sentiment_label 0] 275 | limit: 10 276 | column_limit: 50 277 | row_total: right 278 | x_axis_gridlines: false 279 | y_axis_gridlines: true 280 | show_view_names: false 281 | show_y_axis_labels: true 282 | show_y_axis_ticks: true 283 | y_axis_tick_density: default 284 | y_axis_tick_density_custom: 5 285 | show_x_axis_label: false 286 | show_x_axis_ticks: true 287 | y_axis_scale_mode: linear 288 | x_axis_reversed: false 289 | y_axis_reversed: false 290 | plot_size_by_field: false 291 | trellis: '' 292 | stacking: normal 293 | limit_displayed_rows: false 294 | legend_position: center 295 | point_style: none 296 | show_value_labels: false 297 | label_density: 25 298 | x_axis_scale: auto 299 | y_axis_combined: true 300 | ordering: none 301 | show_null_labels: false 302 | show_totals_labels: false 303 | show_silhouette: false 304 | totals_color: "#808080" 305 | color_application: 306 | collection_id: legacy 307 | custom: 308 | id: a9588210-ca0c-ccce-ac54-4d9e8a6033d8 309 | label: Custom 310 | type: continuous 311 | stops: 312 | - color: "#ea626a" 313 | offset: 0 314 | - color: "#e7b32a" 315 | offset: 50 316 | - color: "#50cec0" 317 | offset: 100 318 | options: 319 | steps: 5 320 | y_axes: [{label: '', orientation: bottom, series: [{axisId: negative - review.count, 321 | id: negative - review.count, name: negative}, {axisId: neutral - review.count, 322 | id: neutral - review.count, name: neutral}, {axisId: positive - review.count, 323 | id: positive - review.count, name: positive}], showLabels: false, showValues: true, 324 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 325 | series_types: {} 326 | series_colors: {} 327 | defaults_version: 1 328 | listen: 329 | Date: review.review_published_date 330 | Location: location.location 331 | Source: review.source 332 | row: 2 333 | col: 0 334 | width: 10 335 | height: 6 336 | - title: Top Attribute Relations w/ Negative Sentiment 337 | name: Top Attribute Relations w/ Negative Sentiment 338 | model: block_keboola_reviews_v2 339 | explore: review 340 | type: looker_bar 341 | fields: [attribute_relation.count, attribute_relation.attribute_relation] 342 | filters: 343 | attribute_relation.sentiment_label: negative 344 | sorts: [attribute_relation.count desc] 345 | limit: 10 346 | x_axis_gridlines: false 347 | y_axis_gridlines: true 348 | show_view_names: false 349 | show_y_axis_labels: true 350 | show_y_axis_ticks: true 351 | y_axis_tick_density: default 352 | y_axis_tick_density_custom: 5 353 | show_x_axis_label: false 354 | show_x_axis_ticks: true 355 | y_axis_scale_mode: linear 356 | x_axis_reversed: false 357 | y_axis_reversed: false 358 | plot_size_by_field: false 359 | trellis: '' 360 | stacking: normal 361 | limit_displayed_rows: false 362 | legend_position: center 363 | point_style: none 364 | show_value_labels: false 365 | label_density: 25 366 | x_axis_scale: auto 367 | y_axis_combined: true 368 | ordering: none 369 | show_null_labels: false 370 | show_totals_labels: false 371 | show_silhouette: false 372 | totals_color: "#808080" 373 | color_application: 374 | collection_id: legacy 375 | palette_id: santa_cruz 376 | options: 377 | steps: 5 378 | y_axes: [{label: '', orientation: bottom, series: [{axisId: attribute_relation.count, 379 | id: attribute_relation.count, name: Relations}, {axisId: review.rating_value, 380 | id: review.rating_value, name: Rating Value}], showLabels: false, showValues: true, 381 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 382 | series_types: {} 383 | series_colors: 384 | attribute_relation.count: "#ed6168" 385 | hidden_fields: [] 386 | defaults_version: 1 387 | listen: 388 | Date: review.review_published_date 389 | Location: location.location 390 | Source: review.source 391 | row: 2 392 | col: 10 393 | width: 14 394 | height: 6 395 | - title: Top Attribute Relations w/ Positive Sentiment 396 | name: Top Attribute Relations w/ Positive Sentiment 397 | model: block_keboola_reviews_v2 398 | explore: review 399 | type: looker_bar 400 | fields: [attribute_relation.count, attribute_relation.attribute_relation] 401 | filters: 402 | attribute_relation.sentiment_label: positive 403 | sorts: [attribute_relation.count desc] 404 | limit: 10 405 | x_axis_gridlines: false 406 | y_axis_gridlines: true 407 | show_view_names: false 408 | show_y_axis_labels: true 409 | show_y_axis_ticks: true 410 | y_axis_tick_density: default 411 | y_axis_tick_density_custom: 5 412 | show_x_axis_label: false 413 | show_x_axis_ticks: true 414 | y_axis_scale_mode: linear 415 | x_axis_reversed: false 416 | y_axis_reversed: false 417 | plot_size_by_field: false 418 | trellis: '' 419 | stacking: normal 420 | limit_displayed_rows: false 421 | legend_position: center 422 | point_style: none 423 | show_value_labels: false 424 | label_density: 25 425 | x_axis_scale: auto 426 | y_axis_combined: true 427 | ordering: none 428 | show_null_labels: false 429 | show_totals_labels: false 430 | show_silhouette: false 431 | totals_color: "#808080" 432 | color_application: 433 | collection_id: legacy 434 | palette_id: santa_cruz 435 | options: 436 | steps: 5 437 | y_axes: [{label: '', orientation: bottom, series: [{axisId: attribute_relation.count, 438 | id: attribute_relation.count, name: Relations}], showLabels: false, showValues: true, 439 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 440 | series_types: {} 441 | series_colors: 442 | attribute_relation.count: "#49cec1" 443 | hidden_fields: [] 444 | defaults_version: 1 445 | listen: 446 | Date: review.review_published_date 447 | Location: location.location 448 | Source: review.source 449 | row: 8 450 | col: 10 451 | width: 14 452 | height: 6 453 | - title: Top Subjects Sentiment Share 454 | name: Top Subjects Sentiment Share 455 | model: block_keboola_reviews_v2 456 | explore: review 457 | type: looker_bar 458 | fields: [attribute_relation.sentiment_label, attribute_relation.count, attribute_relation.subject] 459 | pivots: [attribute_relation.sentiment_label] 460 | filters: 461 | attribute_relation.sentiment_label: "-NULL" 462 | sorts: [attribute_relation.count desc 2, attribute_relation.sentiment_label 0] 463 | limit: 10 464 | row_total: right 465 | x_axis_gridlines: false 466 | y_axis_gridlines: true 467 | show_view_names: false 468 | show_y_axis_labels: true 469 | show_y_axis_ticks: true 470 | y_axis_tick_density: default 471 | y_axis_tick_density_custom: 5 472 | show_x_axis_label: false 473 | show_x_axis_ticks: true 474 | y_axis_scale_mode: linear 475 | x_axis_reversed: false 476 | y_axis_reversed: false 477 | plot_size_by_field: false 478 | trellis: '' 479 | stacking: normal 480 | limit_displayed_rows: false 481 | legend_position: center 482 | point_style: none 483 | show_value_labels: false 484 | label_density: 25 485 | x_axis_scale: auto 486 | y_axis_combined: true 487 | ordering: none 488 | show_null_labels: false 489 | show_totals_labels: false 490 | show_silhouette: false 491 | totals_color: "#808080" 492 | color_application: 493 | collection_id: legacy 494 | palette_id: santa_cruz 495 | options: 496 | steps: 5 497 | y_axes: [{label: '', orientation: bottom, series: [{axisId: negative - attribute_relation.count, 498 | id: negative - attribute_relation.count, name: negative}, {axisId: neutral 499 | - attribute_relation.count, id: neutral - attribute_relation.count, 500 | name: neutral}, {axisId: positive - attribute_relation.count, id: positive 501 | - attribute_relation.count, name: positive}], showLabels: false, showValues: true, 502 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 503 | series_types: {} 504 | series_colors: 505 | attribute_relation.count: "#ed6168" 506 | hierarchy_relation.count: "#e9b404" 507 | negative - attribute_relation.count: "#ed6168" 508 | neutral - attribute_relation.count: "#e9b404" 509 | positive - attribute_relation.count: "#49cec1" 510 | hidden_fields: [] 511 | defaults_version: 1 512 | listen: 513 | Date: review.review_published_date 514 | Location: location.location 515 | Source: review.source 516 | row: 14 517 | col: 10 518 | width: 14 519 | height: 6 520 | - title: Locations Reviews Sentiment 521 | name: Locations Reviews Sentiment 522 | model: block_keboola_reviews_v2 523 | explore: review 524 | type: looker_bar 525 | fields: [review.count, location.location, review.sentiment_label] 526 | pivots: [review.sentiment_label] 527 | filters: 528 | review.sentiment_label: "-NULL" 529 | sorts: [review.count desc 3, review.sentiment_label] 530 | limit: 10 531 | column_limit: 50 532 | row_total: right 533 | x_axis_gridlines: false 534 | y_axis_gridlines: true 535 | show_view_names: false 536 | show_y_axis_labels: true 537 | show_y_axis_ticks: true 538 | y_axis_tick_density: default 539 | y_axis_tick_density_custom: 5 540 | show_x_axis_label: false 541 | show_x_axis_ticks: true 542 | y_axis_scale_mode: linear 543 | x_axis_reversed: false 544 | y_axis_reversed: false 545 | plot_size_by_field: false 546 | trellis: '' 547 | stacking: normal 548 | limit_displayed_rows: false 549 | legend_position: center 550 | point_style: none 551 | show_value_labels: false 552 | label_density: 25 553 | x_axis_scale: auto 554 | y_axis_combined: true 555 | ordering: none 556 | show_null_labels: false 557 | show_totals_labels: false 558 | show_silhouette: false 559 | totals_color: "#808080" 560 | color_application: 561 | collection_id: legacy 562 | custom: 563 | id: 53e10800-30b6-82cc-988f-b1f73f46912e 564 | label: Custom 565 | type: continuous 566 | stops: 567 | - color: "#ea626a" 568 | offset: 0 569 | - color: "#e7b32a" 570 | offset: 50 571 | - color: "#50cec0" 572 | offset: 100 573 | options: 574 | steps: 5 575 | y_axes: [{label: '', orientation: bottom, series: [{axisId: negative - review.count, 576 | id: negative - review.count, name: negative}, {axisId: neutral - review.count, 577 | id: neutral - review.count, name: neutral}, {axisId: positive - review.count, 578 | id: positive - review.count, name: positive}], showLabels: false, showValues: true, 579 | unpinAxis: false, tickDensity: default, tickDensityCustom: 5, type: linear}] 580 | series_types: {} 581 | series_colors: {} 582 | defaults_version: 1 583 | listen: 584 | Date: review.review_published_date 585 | Location: location.location 586 | Source: review.source 587 | row: 8 588 | col: 0 589 | width: 10 590 | height: 6 591 | filters: 592 | - name: Date 593 | title: Date 594 | type: date_filter 595 | default_value: 3 months 596 | allow_multiple_values: true 597 | required: false 598 | - name: Location 599 | title: Location 600 | type: field_filter 601 | default_value: '' 602 | allow_multiple_values: true 603 | required: false 604 | model: block_keboola_reviews_v2 605 | explore: review 606 | listens_to_filters: [] 607 | field: location.location 608 | - name: Source 609 | title: Source 610 | type: field_filter 611 | default_value: '' 612 | allow_multiple_values: true 613 | required: false 614 | model: block_keboola_reviews_v2 615 | explore: review 616 | listens_to_filters: [] 617 | field: review.source --------------------------------------------------------------------------------