精准定制:利用本地词库优化Jieba分词,提升景区评论数据LDA建模效果

引言:

在进行景区评论数据的LDA建模时,精确的分词是至关重要的。然而,通用的分词工具在处理特定领域的文本时可能表现不佳。针对这一挑战,本文探讨了如何利用本地词库,特别是搜狗词库中关于旅游领域的专业词汇,对Jieba分词进行精细化调整。通过这种方式,我们可以实现对景区评论数据的更精准、更有效的LDA建模,从而揭示出更深层次的见解和洞察。本文将探讨如何结合本地词库定制词典,优化分词过程,从而提升LDA模型的表现,为景区评论数据的分析与应用提供更可靠的基础。

正文

lda模型主题示意图image.png
从主题结果来看分词结果有些词如中山市被分成 中 山市 这种,为后期的LDA建模带来了误差。
因此组建自己的词库很有必要,替换默认词典+自定义词典的方式,对jieba的分词进行更精细化的调整。
查找了很多资料最终选择使用搜狗词库去组建自己的词库

首先下载相关词库

image.png
下载后将.scel文件转换为.txt文件

词库格式转化

使用以下脚本进行转换

#!/usr/bin/python
# -*- coding: utf-8 -*-


import struct
import sys
import binascii
import pdb

# 搜狗的scel词库就是保存的文本的unicode编码,每两个字节一个字符(中文汉字或者英文字母)
# 找出其每部分的偏移位置即可
# 主要两部分
# 1.全局拼音表,貌似是所有的拼音组合,字典序
#       格式为(index,len,pinyin)的列表
#       index: 两个字节的整数 代表这个拼音的索引
#       len: 两个字节的整数 拼音的字节长度
#       pinyin: 当前的拼音,每个字符两个字节,总长len
#
# 2.汉语词组表
#       格式为(same,py_table_len,py_table,{word_len,word,ext_len,ext})的一个列表
#       same: 两个字节 整数 同音词数量
#       py_table_len:  两个字节 整数
#       py_table: 整数列表,每个整数两个字节,每个整数代表一个拼音的索引
#
#       word_len:两个字节 整数 代表中文词组字节数长度
#       word: 中文词组,每个中文汉字两个字节,总长度word_len
#       ext_len: 两个字节 整数 代表扩展信息的长度,好像都是10
#       ext: 扩展信息 前两个字节是一个整数(不知道是不是词频) 后八个字节全是0
#
#      {word_len,word,ext_len,ext} 一共重复same次 同音词 相同拼音表

# 拼音表偏移,
startPy = 0x1540;

# 汉语词组表偏移
startChinese = 0x2628;

# 全局拼音表

GPy_Table = {}

# 解析结果
# 元组(词频,拼音,中文词组)的列表
GTable = []


def byte2str(data):
    '''将原始字节码转为字符串'''
    i = 0;
    length = len(data)
    ret = u''
    while i < length:
        x = data[i:i+2]
        t =  chr(struct.unpack('H', x)[0])
        if t == u'\r':
            ret += u'\n'
        elif t != u' ':
            ret += t
        i += 2
    return ret


# 获取拼音表
def getPyTable(data):
    if data[0:4] != bytes(map(ord,"\x9D\x01\x00\x00")):
        return None
    data = data[4:]
    pos = 0
    length = len(data)
    while pos < length:
        index = struct.unpack('H', data[pos:pos +2])[0]
        # print index,
        pos += 2
        l = struct.unpack('H', data[pos:pos + 2])[0]
        # print l,
        pos += 2
        py = byte2str(data[pos:pos + l])
        # print py
        GPy_Table[index] = py
        pos += l


# 获取一个词组的拼音
def getWordPy(data):
    pos = 0
    length = len(data)
    ret = u''
    while pos < length:
        index = struct.unpack('H', data[pos:pos + 2])[0]
        ret += GPy_Table[index]
        pos += 2
    return ret


# 获取一个词组
def getWord(data):
    pos = 0
    length = len(data)
    ret = u''
    while pos < length:
        index = struct.unpack('H', data[pos:pos +2])[0]
        ret += GPy_Table[index]
        pos += 2
    return ret


# 读取中文表
def getChinese(data):
    # import pdb
    # pdb.set_trace()

    pos = 0
    length = len(data)
    while pos < length:
        # 同音词数量
        same = struct.unpack('H', data[pos:pos + 2])[0]
        # print '[same]:',same,

        # 拼音索引表长度
        pos += 2
        py_table_len = struct.unpack('H', data[pos:pos + 2])[0]
        # 拼音索引表
        pos += 2
        py = getWordPy(data[pos: pos + py_table_len])

        # 中文词组
        pos += py_table_len
        for i in range(same):
            # 中文词组长度
            c_len = struct.unpack('H', data[pos:pos +2])[0]
            # 中文词组
            pos += 2
            word = byte2str(data[pos: pos + c_len])
            # 扩展数据长度
            pos += c_len
            ext_len = struct.unpack('H', data[pos:pos +2])[0]
            # 词频
            pos += 2
            count = struct.unpack('H', data[pos:pos +2])[0]

            # 保存
            GTable.append((count, py, word))

            # 到下个词的偏移位置
            pos += ext_len


def deal(file_name):
    print
    '-' * 60
    f = open(file_name, 'rb')
    data = f.read()
    f.close()

    if data[0:12] != bytes(map(ord,"\x40\x15\x00\x00\x44\x43\x53\x01\x01\x00\x00\x00")):
        print
        "确认你选择的是搜狗(.scel)词库?"
        sys.exit(0)
    # pdb.set_trace()

    print
    "词库名:", byte2str(data[0x130:0x338])  # .encode('GB18030')
    print
    "词库类型:", byte2str(data[0x338:0x540])  # .encode('GB18030')
    print
    "描述信息:", byte2str(data[0x540:0xd40])  # .encode('GB18030')
    print
    "词库示例:", byte2str(data[0xd40:startPy])  # .encode('GB18030')

    getPyTable(data[startPy:startChinese])
    getChinese(data[startChinese:])


if __name__ == '__main__':

    # 将要转换的词库添加在这里就可以了
    o = ['旅游词汇大全【官方推荐】.scel',"旅游词汇大全.scel","旅游词汇大全 (1).scel"]

    for f in o:
        deal(f)

    # 保存结果
    f = open('sougou.txt', 'w',encoding='utf-8')
    for count, py, word in GTable:
        # GTable保存着结果,是一个列表,每个元素是一个元组(词频,拼音,中文词组),有需要的话可以保存成自己需要个格式
        # 我没排序,所以结果是按照上面输入文件的顺序
        f.write((('{%(count)s}' % {'count': count} + py + ' ' + word)))  # 最终保存文件的编码,可以自给改
        f.write('\n')
    f.close()

运行结果示意图
image.png

对词库进行去除和预处理

将众多词库解析统合后得到4000多个词条,接着进行去重和预处理
编写脚本entry_preprocessing.py进行处理

# Author: 冷月半明
# Date: 2024/1/26
# Description: 将统合后的词库进行预处理,只保留每行的中文字段,然后进行去重.
import re

# 读取文件并提取中文字段
def extract_chinese(file_path):
    chinese_words = set()  # 用集合来存储中文字段,实现去重
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            chinese = re.findall(r'[\u4e00-\u9fa5]+', line)  # 使用正则表达式提取中文
            if chinese:
                chinese_words.add(chinese[0])
    return chinese_words

# 文件路径
file_path = 'sougou.txt'

# 提取中文字段并去重
chinese_words = extract_chinese(file_path)

# 将中文字段保存到txt文件
output_file = 'chinese_words.txt'
with open(output_file, 'w', encoding='utf-8') as file:
    for word in chinese_words:
        file.write(word + '\n')

print(f"去重后的中文字段已保存到文件: {output_file}")

结果展示图

将txt文件作为custom_dict分词词库参与分词。
与此同时,也可以手动的像词库添加一些专业词汇或常用词汇以达到更优的分词效果。
image.png

重新建模后主题展示图

image.png
可以看到中山市的主题的话题关键词中 原先的中山已被中山市替换,说明从分词角度来说优化成功,LDA模型更加合理。

本文章仅供学习参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

virtualbox 设置虚拟机 centos 网络

在VirtualBox中为运行CentOS系统的虚拟机配置网络连接&#xff0c;您通常可以选择以下几种网络模式之一&#xff0c;以满足不同的网络需求&#xff1a; NAT (Network Address Translation): 功能&#xff1a;允许虚拟机通过宿主机的网络连接访问互联网&#xff0c;同时也可以从…

【vue】一个小bug和key的引入

点击master Vue!删除后该list后输入框中的Jerry消失了 原因&#xff1a;vue当你更改元素时会在真实的dom中渲染并更新list。这两个goal是两个dom元素,触发点击事件后,vue并不会删除第一个dom元素,而是把第二个dom元素的动态内容({{ goal }} - {{ index }})复制到第一个dom元素…

Python基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中&#xff0c;可以使用内置的数学运算符&#xff0c;例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过&#xff0c;更高级的运算&a…

SpringCloud下的微服务应用技术(结尾篇)

六. Feign远程调用 6.1 替代RestTemplate RestTemplate调用问题&#xff1a;代码可读性差&#xff0c;参数复杂且URL难维护。 Feign是一个声明式的HTTP客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign: Feign makes writing java http clients easier 它可…

力扣热门算法题 128. 最长连续序列,134. 加油站,143. 重排链表

128. 最长连续序列&#xff0c;134. 加油站&#xff0c;143. 重排链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.26 可通过leetcode所有测试用例。 目录 128. 最长连续序列 解题思路 完整代码 Python Java 134. 加油…

Docker 部署 FRP 内网穿透 实现端口映射

Frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官网地址&#xff1a;https://github.com/fatedier/frp 准备工作…

VS2019连接MySQL

VS2019连接MySQL 下载MySQL Connector/C配置头文件&#xff0c;库文件路径配置头文件路径配置库的路径复制dll文件 MySQL的用户设置将权限赋值给新用户 编写代码往数据库写入 老师布置的作业让我们用VS2019连接MySQL实现一个小型的日志系统&#xff0c;中间踩了很多的坑&#x…

【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环

3道链表力扣题 一、删除链表中的节点&#x1f30f; 题目链接&#x1f4d5; 示例&#x1f340; 分析&#x1f4bb; 代码 二、反转链表&#x1f30f; 题目链接&#x1f4d5; 示例&#x1f340; 分析① 递归② 迭代 三、判断一个链表是否有环&#x1f30f; 题目链接&#x1f4d5; …

文件操作(顺序读写篇)

1. 顺序读写函数一览 函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件 上面说…

FPGA----ZCU106的petalinux 2019.1使用USB传输数据

1、实际项目中需要用到开发板的串口进行数据交互&#xff0c;之前讲的几节只是启动了网口&#xff08;如下链接&#xff09;。因此&#xff0c;本次给大家带来的官方自带串口例程的使用方法&#xff0c;本文的vivado工程和下述连接一样&#xff0c;PL端什么配置都没有。 FPGA-…

A Simple Problem with Integers(线段树)

目录 描述 输入 输出 样例输入 样例输出 思路 建树 第一次错误解法&#xff08;正确解法在下面&#xff0c;可跳过这一步&#xff09; 正确解法 code 描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of …

云架构(二) 大使模式

Ambassador pattern &#xff08;https://learn.microsoft.com/en-us/azure/architecture/patterns/ambassador&#xff09; 简单描述 创建一个助手服务&#xff0c;这个服务代表消费服务或者应用程序发送网络请求。大使服务可以看做是与客户机同一个位置的进程外代理。 这种…

如何快速掌握数字化运维方法,构建数字化运维体系?

⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越多】 主要内容读者…

简单实现企业微信远程打卡教程(永不迟到)

最近玩手游时刚好用到了手机模拟器&#xff0c;就是在电脑上安装一个手机模拟器&#xff0c;然后用电脑来挂机手机游戏 今天我突然有了一个想法&#xff0c;既然这个模拟器就是相当于一个虚拟的手机&#xff0c;那么是不是可以给它装上企业微信&#xff0c;然后让它帮我远程打卡…

vs_BuildTools.exe

Microsoft C Build Tools - Visual Studio vs_BuildTools.exe 安装无反应 无法进入安装界面。 转了一大圈&#xff1a; 最后决定更新系统&#xff0c;解决。 参考链接&#xff1a;执行了最后一步&#xff0c;更新系统&#xff1a; Fix: Faulting Application Path Error o…

详细了解RC4加密算法

一.什么是RC4加密算法 RC4加密算法是一种对称加密算法&#xff1a; 对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法&#xff0c;就是加密密钥能够从解密密钥中推算出来&#xff0c;同时解密密钥也可以从加密密钥中推算出来。而在大多数的对…

gpt-llm-trainer 出炉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如果有效的编写 ChatGPT 提示?

1. 明确目标&#xff1a;确定使用 ChatGPT 的目的。无论是创意写作、产生想法还是查找信息&#xff0c;知道你想要什么可以让你更有效地使用这个工具。 2. 具体说明&#xff1a;你的提示越具体&#xff0c;ChatGPT 就越能理解你的需求。例如&#xff0c;你可以要求 ChatGPT…

哔哩哔哩直播姬第三方obs推流使用教程

1 obs studio下载(官方下载较慢) 链接&#xff1a;https://pan.baidu.com/s/1fIKJkieYIta0gG-sX7Cr6g?pwdz7s9 提取码&#xff1a;z7s9 2 打开哔哩哔哩直播姬客户端并登录(pc版) 3 打开obs客户端进行推流(如果推流不成功,可能是驱动的问题,记得更新下驱动) 首先添加播放源 …

在同一个网站上自动下载多个子页面内容

一、问题现象 第一次遇到这样的问题&#xff0c;如下图&#xff1a; 即在同一个网站上下载多个内容时&#xff0c;第一个内容明明已经正常get到了&#xff0c;但开始第二个页面的查询 以后&#xff0c;原来已经查出的内容就找不到了。 二、解决办法 我不知道大家是不是遇到…