热词统计分析

前言

为了能够出热词,走了不少歪路。所以就记下来。尝试的方案有如下:

  • 按条件搜索文档后分析词频
  • keep words:按自己的词典去构建热词分析
  • 按条件搜索文档后按查询的分值分析热词

按条件搜索文档后分析词频

{
  "from": 0,
  "_source": false,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "ctime": {
              "gte": "2018-10-10 09:36:00",
              "lte": "2020-10-10 09:36:00"
            }
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "aggs": {
    "genres": {
      "terms": {
        "size": 100,
        "field": "content",
        "min_doc_count": 3
      }
    }
  }
}

这种方式查询的结果如下:

热词统计分析

虽然可以统计出词频最多的词组,但是也可能会出现很多不相关的词组。因为目的是监控舆情,可是和舆情相关的词组太少。

需要注意的是contentmappings中必须开启filedata

"content": {
          "store": false,
          "analyzer": "cnFilter",
          "search_analyzer": "ik_smart",
          "type": "text",
          "index": true,
          "fielddata": true
        },

keep_words

keep words是正向匹配热词,只会对keep words配置的字典分词统计。所以为了能够即满足ik_smart分词,又满足keep words,需要多字段配置。

"content": {
          "store": false,
          "analyzer": "cnFilter",
          "search_analyzer": "ik_smart",
          "fields": {
            "keyword": {
              "type": "text",
              "index": true,
              "analyzer":"keep_words",
              "search_analyzer":"keep_words",
              "fielddata": true
            }
          },
          "type": "text",
          "index": true,
          "fielddata": true
        },

如此在热词统计的时候只要指定content.keyword查询并统计即可。这里analyzersearch_analyzer都配置为keep_wordskeep_words是自定义的分析器,主要是用到了过滤器:

"keep_word_file": {
            "type": "keep",
            "keep_words_path": "keep_words.dic"
          }

keep_words链接

这么做的好处就是得到的词组都是我们需要的词组,不好的地方就是更新热词需要重启ES,并且只能对后来的文档分析起作用。

按条件搜索文档后按查询的分值分析热词

{
    "size": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "ctime": {
                            "from": "2019-11-11 10:12:31",
                            "to": "2020-11-11 10:12:31"
                        }
                    }
                },
                {
                    "query_string": {
                        "query": " (赌局 OR 非法 OR 内幕 OR 黑彩 OR 坐庄 OR 赌博 OR 调包 OR 勾结 OR 犯罪 OR 欺诈 OR 诈骗 OR 合谋 OR 窝藏 OR 私分 OR 盗窃 OR 虚假 OR 假币 OR 丑闻 OR 行贿 OR 开庭 OR 查处 OR 举报 OR 报案 OR 公安 OR 违规 OR 造假) ",
                        "fields": [
                            "content^1.0"
                        ],
                        "type": "best_fields",
                        "default_operator": "and",
                        "analyzer": "ik_max_word",
                        "max_determinized_states": 10000,
                        "enable_position_increments": true,
                        "fuzziness": "AUTO",
                        "fuzzy_prefix_length": 0,
                        "fuzzy_max_expansions": 50,
                        "phrase_slop": 0,
                        "escape": false,
                        "auto_generate_synonyms_phrase_query": true,
                        "fuzzy_transpositions": true,
                        "boost": 1
                    }
                }
            ],
            "must_not": [
                {
                    "query_string": {
                        "fields": [
                            "content^1.0"
                        ],
                        "query": "(墙体彩绘 OR 人体彩绘 OR 牙齿 OR 房价 OR 口腔 OR 胆码 OR 删号 OR 公式 OR 连号 OR 拖码 OR 顺子 OR 质数 OR 冷码 OR 热码 OR 冷号 OR 热号 OR 区间 OR 和值 OR 跨度 OR 独胆 OR 大小比 OR 012路 OR 5码 OR 4码 OR 3码 OR 2码 OR 红球遗漏 OR 蓝球遗漏 OR 质合 OR 龙头 OR 凤尾 OR 缩水 OR 亚指 OR 欧指 OR 让球 OR 上盘 OR 下盘 OR 主让 OR 客让 OR 主负 OR 主胜 OR 让平 OR 让胜 OR 让负 OR 银行 OR 邮政 OR 快递 OR 地铁 OR 火车 OR 高铁 OR 铁路 OR 动画 OR 电影)"
                    }
                },
                {
                    "query_string": {
                        "fields": [
                            "kw^1.0"
                        ],
                        "query": "(好运射击 OR 站点)"
                    }
                }
            ],
            "should": [
                {
                    "query_string": {
                        "query": " (彩票 OR 体彩 OR 福彩 OR 博彩 OR 赌博 OR 黑彩 OR 彩民 OR 开奖 OR 投注站 OR 网点 OR 站点 OR 大乐透 OR 排列 OR 排列三 OR 排3 OR 排三 OR 排列5 OR 排列五 OR 排5 OR 排五 OR 七星彩 OR 7星彩 OR 任选九 OR 任选9 OR 任九 OR 任9 OR 竞彩 OR 竞猜 OR 顶呱刮 OR 顶呱呱 OR 足彩 OR 足球彩票 OR 北京单场 OR 北单 OR 中彩中心 OR 中福在线 OR 快开 OR 高频 OR 双色球 OR 3D OR 快乐8 OR 快乐八 OR 刮刮乐 OR 即开票 OR 即开 OR 视频彩票 OR 视频票 OR 电脑彩票 OR 电脑票 OR 好运射击 OR 连环夺宝 OR 趣味高尔夫 OR 三江风光 OR 四花选五 OR 幸运五彩) ",
                        "fields": [
                            "content^1.0"
                        ],
                        "type": "best_fields",
                        "default_operator": "and",
                        "analyzer": "ik_max_word",
                        "max_determinized_states": 10000,
                        "enable_position_increments": true,
                        "fuzziness": "AUTO",
                        "fuzzy_prefix_length": 0,
                        "fuzzy_max_expansions": 50,
                        "phrase_slop": 0,
                        "escape": false,
                        "auto_generate_synonyms_phrase_query": true,
                        "fuzzy_transpositions": true,
                        "boost": 1
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
    "aggregations": {
        "agg_b_significant_text_content_sampler": {
            "sampler": {
                "shard_size": 400
            },
            "aggregations": {
                "agg_b_significant_text_content": {
                    "significant_text": {
                        "size": 300,
                        "min_doc_count": 3,
                        "shard_min_doc_count": 0,
                        "field": "content",
                        "filter_duplicate_text": true,
                        "exclude": [],
                        "mutual_information": {
                            "include_negatives": true,
                            "background_is_superset": true
                        }
                    }
                }
            }
        }
    }
}

搜索得到的结果如:

热词统计分析

虽然在返回的词组中依然存在不相关的,但是可以通过配置exclude和include动态的去实现屏蔽或者增加新的词组。也可以从长远考虑的角度上将无关的词配置到ik的stopwords。

ELK
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!