├── 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
--------------------------------------------------------------------------------