NLP(四十八)文本纠错之获取形近字

2023-10-28 00:30

本文主要是介绍NLP(四十八)文本纠错之获取形近字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

  笔者最近在从事文本纠错的相关工作,颇有收获,因此记录于此。
  文本纠错很大一部分工作在于纠正同音字、形近字,所谓形近字,是指字形相近的汉字。本文将介绍如何获取形近字。
  获取形近字的算法如下:

  1. 获取汉字库,将所有汉字转化为黑白图片;
  2. 获取每个汉字的向量表示(即将图片转化为向量);
  3. 计算两个汉字的向量的余弦相似度,得到它们的字形相似度。

  下面将详细演示如何获取形近字。

获取形近字

  我们从网上得到3500个汉字的txt文件(all_3500_chars.txt),通过pygame将汉字转化为100*100的黑白图片,Python程序如下:

# -*- coding: utf-8 -*-
import pygamepygame.init()
# 获取3500个汉字
with open("all_3500_chars.txt", "r", encoding="utf-8") as f:chars = f.read().strip()# 通过pygame将汉字转化为黑白图片
for char in chars:font = pygame.font.Font("C://Windows/Fonts/simkai.ttf", 100)rtext = font.render(char, True, (0, 0, 0), (255, 255, 255))pygame.image.save(rtext, "{}.png".format(char))

前10个汉字为一乙二十丁厂七卜人入,其对应的黑白图片如下:

前10个汉字图片
  接着我们获取每个汉字的向量表示,并将这两个向量的余弦相似度作为对应汉字的余弦相似度,Python程序如下:

# -*- coding: utf-8 -*-
# get_similiar_char.py
import numpy as np
import cv2
import os
from operator import itemgetterdef read_img_2_list(img_path):# 读取图片img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), -1)# 把图片转换为灰度模式img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).reshape(-1, 1)return [_[0] for _ in img.tolist()]# 获取所有汉字的向量表示,以dict储存
def get_all_char_vectors():image_paths = [_ for _ in os.listdir(".") if _.endswith("png")]img_vector_dict = {}for image_path in image_paths:img_vector_dict[image_path[0]] = read_img_2_list(img_path=image_path)return img_vector_dict# 计算两个向量之间的余弦相似度
def cosine_similarity(vector1, vector2):dot_product = 0.0normA = 0.0normB = 0.0for a, b in zip(vector1, vector2):dot_product += a * bnormA += a ** 2normB += b ** 2if normA == 0.0 or normB == 0.0:return 0else:return dot_product / ((normA**0.5)*(normB**0.5))if __name__ == '__main__':img_vector_dict = get_all_char_vectors()# 获取最接近的汉字similarity_dict = {}while True:match_char = input("输入汉字: ")match_vector = img_vector_dict[match_char]for char, vector in img_vector_dict.items():cosine_similar = cosine_similarity(match_vector, vector)similarity_dict[char] = cosine_similar# 按相似度排序,取前10个sorted_similarity = sorted(similarity_dict.items(), key=itemgetter(1), reverse=True)print([(char, round(similarity, 4))for char, similarity in sorted_similarity[:10]])

我们尝试着输入国、填、博这三个字,得到的相近字形的汉字如下:

输入汉字: 国
[(‘国’, 1.0), (‘固’, 0.9493), (‘团’, 0.9432), (‘困’, 0.9405), (‘因’, 0.9369), (‘围’, 0.9357), (‘门’, 0.9334), (‘园’, 0.9326), (‘同’, 0.929), (‘圆’, 0.9261)]
输入汉字: 填
[(‘填’, 1.0), (‘慎’, 0.9522), (‘坞’, 0.9238), (‘培’, 0.9149), (‘坎’, 0.9133), (‘块’, 0.9101), (‘币’, 0.9092), (‘镇’, 0.9077), (‘埠’, 0.9074), (‘了’, 0.9044)]
输入汉字: 博
[(‘博’, 1.0), (‘傅’, 0.9306), (‘协’, 0.9115), (‘搏’, 0.907), (‘惰’, 0.9046), (‘膊’, 0.9029), (‘愕’, 0.9019), (‘侯’, 0.8999), (‘悴’, 0.8997), (‘怜’, 0.8989)]

opencv读取文件名为汉字的图片

  在使用opencv读物文件名为汉字的图片时,读取的图片内容为None,我们以一.png为例,演示程序如下:

# -*- coding: utf-8 -*-
import cv2image_path = "一.png"
img = cv2.imread(image_path, 1)
print(img, type(img))

输出结果为None <class 'NoneType'>。也就是说,opencv在读取带汉字的文件路径时会报错,解决办法如下:

# -*- coding: utf-8 -*-
import cv2
import numpy as npimage_path = "一.png"
img = cv2.imdecode(np.fromfile(image_path, dtype=np.uint8), -1)
print(img.shape, type(img))

输出结果为(100, 100, 3) <class 'numpy.ndarray'>

总结

  本文通过将汉字转化为图片,获取图片的向量表示来表征汉字,在获取形近字方面有着不错的效果。
  我们可以通过更复杂的图片相似度算法来增强获得更好的形近字能力。
  也有不少研究者,通过四角码、音形码等算法来获取形近字,取得了不错的效果。本文想法朴素,容易用程序实现,且效果也较为不错。
  后面将继续记录笔者在文本纠错方面的尝试,欢迎大家继续阅读~
  2021年6月29日于上海浦东,此日上海暑气逼人~

这篇关于NLP(四十八)文本纠错之获取形近字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289431

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa