前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简体字和繁體字

简体字和繁體字

作者头像
不可言诉的深渊
发布2019-07-26 17:29:08
1.7K0
发布2019-07-26 17:29:08
举报

导言

我们都知道中国汉字有两种,简体字和繁体字,有些人喜欢用简体,有些人喜欢用繁体。可是大家在使用繁体字的过程中会发现有些字简体繁体一样,比如说“字”这个字,今天我们就来统计一下像这样的字占到所有汉字的百分之多少。

先简单的理一下实现思路,先获取所有的简体字,然后使用百度翻译把简体翻译成繁体,接着进行比较,最后统计一下就完了。

获取简体字

我们先来看第一步——获取简体字。我们通过爬取http://www.jiantizi.com/dic/pinyin/1.htm这个网站获取简体字,网站显示结果如图所示。

我们把鼠标放在某一个字上面,右击→检查,查看这个字放在HTML源码当中的什么位置,多看几个字就可以写出正则表达式了,最后写出来的正则应该是这样:r"<a href='\.\./hanzi\.asp\?i=.*?'>(.*?)</a>",接下来我们就来验证一下,先爬一页看看结果,因为逻辑比较简单,直接给出代码:

from requests import get
from re import compile
simplified_pattern = compile(r"<a href='\.\./hanzi\.asp\?i=.*?'>(.*?)</a>")
print(simplified_pattern.findall(get('http://www.jiantizi.com/dic/pinyin/1.htm').content.decode('gb18030')))

运行结果:

可以发现它把第1页所有的字都爬下来了,这么点字绝对不够,我们继续去爬第2页,点击2>>前往第2页,会发现网址的URL变成了http://www.jiantizi.com/dic/pinyin/2.htm,我们先看一下总共有多少页,其实大家应该都看到了,总共有51页,要爬取所有的简体字就简单了,直接使用for循环从第1页遍历到第51页,然后就是把获取第1页数据的逻辑套进去。

from requests import get
from re import compile
simplified_pattern = compile(r"<a href='\.\./hanzi\.asp\?i=.*?'>(.*?)</a>")
for i in range(1, 52):
    print(simplified_pattern.findall(get(f'http://www.jiantizi.com/dic/pinyin/{i}.htm').content.decode('gb18030')))

运行结果:

获取简体字这一步已经完成了,接下来我们开始下一步,把简体字翻译成繁体字。

简体字翻译成繁体字

为了提高效率,我就不一个字一个字翻译,而是一批一批翻译,先获取第一页的字,然后拼接成字符串去一并翻译,然后第二页执行类似的操作,因为百度翻译API要收费,所以我不得不杀鸡用牛刀,直接使用selenium完成翻译,翻译的网址是https://fanyi.baidu.com/#zh/cht/,当翻译的时候会发现URL发生了变化,变成了'https://fanyi.baidu.com/#zh/cht/'+quote(要翻译的内容),最后看一下翻译的内容放在网页源码的什么位置,写出正则,在这里我直接给出正则表达式:r'<p class="ordinary-output target-output clearfix">(.*?)</p>',正则写出来就简单了,直接给出源代码,看不懂也没关系。

from requests import get
from re import compile
from selenium.webdriver import Chrome, ChromeOptions
from urllib.parse import quote
from time import sleep
simplified_pattern = compile(r"<a href='\.\./hanzi\.asp\?i=.*?'>(.*?)</a>")
traditional_pattern = compile(r'<p class="ordinary-output target-output clearfix">(.*?)</p>')
chrome_options = ChromeOptions()
chrome_options.add_argument('--headless')
with Chrome(options=chrome_options)as browser:
    for i in range(1, 52):
        simplified_chars = ''.join(simplified_pattern.findall(get(
            f'http://www.jiantizi.com/dic/pinyin/{i}.htm').content.decode('gb18030')))
        browser.get(f'https://fanyi.baidu.com/#zh/cht/{quote(simplified_chars)}')
        sleep(2)
        print(traditional_pattern.findall(browser.page_source))

运行结果:

我们可以发现结果有一些看着不顺眼的地方,比如每一批字前后都有空格,我们需要使用字符串方法strip()去掉前后的空格。其实只要修改最后一行代码就可以去掉空格输出了。把最后一行改成print(tranditional_pattern.findall(browser.page_source)[0].strip()),然后看一下运行结果。

看着好像没什么问题,但是往下找,会发现有一个地方好像多出来了一个字,如图所示。

经过一番调查,可以发现它把简体字“位”翻译成繁体是两个字——比特。长度不一致是无法比较的,我们直接忽略这个字,怎么忽略就不用我讲了吧,字符串方法replace就可以做到。

翻译的工作也已经完成了,下面开始最后一个步骤——比较。

比较简体字和繁体字

比较的过程很简单,就是一个一个字比较,在比较之前我们先定义两个全局变量,一个是简体字集,一个是繁体字集。为了方便比较,这两个集合用序列表示,我使用字符串表示,所以初始化这两个变量为空字符串。然后使用for循环同时遍历两个序列,逐个比较,生成一个列表,列表中的每一个元素是布尔类型,其中True表示简体繁体一样,False表示简体繁体不一样,最后使用collections模块的Counter类实现计数就行了。下面直接给出完整的源代码。

from requests import get  # get请求
from re import compile  # 把正则字符串编译成正则表达式对象
from selenium.webdriver import Chrome, ChromeOptions  # Chrome:谷歌浏览器驱动,ChromeOptions:谷歌浏览器驱动参数设置
from urllib.parse import quote  # 中文URL编码
from time import sleep  # 设置等待
from collections import Counter  # 计数器
simplified_pattern = compile(r"<a href='\.\./hanzi\.asp\?i=.*?'>(.*?)</a>")  # 简体字正则
traditional_pattern = compile(r'<p class="ordinary-output target-output clearfix">(.*?)</p>')  # 繁体字正则
chrome_options = ChromeOptions()  # 实例化一个浏览器驱动设置类
chrome_options.add_argument('--headless')  # 添加参数--headless,在运行程序时就不会弹出浏览器了
simplified = traditional = ''  # simplified:简体字集,traditional:繁体字集
"""
将浏览器驱动设置对象传给浏览器驱动对象构造方法的options参数
with关键字在这里用于自动关闭浏览器驱动
"""
with Chrome(options=chrome_options)as browser:
    # 遍历每一页,获取简体字并翻译成繁体字
    for i in range(1, 52):
        # 发送请求获取响应,把响应对象的内容解码,然后用正则去匹配响应的内容,找出所有匹配的对象,最后拼接起来
        simplified_chars = ''.join(simplified_pattern.findall(get(
            f'http://www.jiantizi.com/dic/pinyin/{i}.htm').content.decode('gb18030')))
        # “位”翻译成繁体是两个字——“比特”,因为长度不一致,直接忽略
        simplified_chars = simplified_chars.replace('位', '')
        simplified += simplified_chars  # 将获取的简体字添加到简体字集合中
        browser.get(f'https://fanyi.baidu.com/#zh/cht/{quote(simplified_chars)}')  # 用selenium模拟浏览器请求
        sleep(2)  # 等待页面加载完成
        # 用繁体字正则去匹配浏览器驱动对象的网页源码,去第一个元素并使用strip去掉前后的空格
        traditional_chars = traditional_pattern.findall(browser.page_source)[0].strip()
        traditional += traditional_chars  # 将获取的繁体字添加到繁体字集合中
        # 通过输出查看有没有出现数据不对的情况
        print(simplified_chars)
        print(traditional_chars+'\n')
# 一个字一个字比较,比较完成之后计数输出统计的结果
print(Counter([simplified[i] == traditional[i]for i in range(len(simplified))]))

最后放一下运行结果,如图所示。

从结果中我们可以发现有1607/(1607+893)=64.28%的字简体和繁体一样。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档