Python3 中日语料分句实现
0. 背景
因为最近在看平行语料句对齐、词对齐的缘故,想做对齐的话需要先做一个分句。
一开始利用正则和引号开关标志写了一种方法,中间想到一个小技巧,写出来比较简单通用,想把这一小段代码分享一下。
1. 原理
一些情况下,标点也算是比较好的一个特征,这里就想尽量正确的切分。
主要考虑到的问题包括:
- 分隔符保留
- 引号内的句子
- 同一处多个标点
决定引号内不切分之后,利用一点小技巧使得思路非常明确:
将括号内的做为整体保存到一个队列,同时用一个标志占位。
分好以后再替换回来。
2. 代码
注意, 此处利用一个零宽的正则做为分割标志,但re.split()无法用其做分隔,会产生ValueError。
def my_split(string):
"""
将引号内看作整体保存与队列,后面再换回
省略号暂时不加
# todo 可以考虑说话部分的分句,
# 例如‘xxx:“xxx。”xx,xxxx。’
# 还可分。
"""
SPLIT_SIGN = '%%%%' # 需要保证字符串内本身没有这个分隔符
# 替换的符号用: $PACK$
SIGN = '$PACK$'
search_pattern = re.compile('\$PACK\$')
pack_pattern = re.compile('(“.+?”|(.+?)|《.+?》|〈.+?〉|[.+?]|【.+?】|‘.+?’|「.+?」|『.+?』|".+?"|\'.+?\')')
pack_queue = []
pack_queue = re.findall(pack_pattern, string)
string = re.sub(pack_pattern, SIGN, string)
pattern = re.compile('(?<=[。?!])(?![。?!])')
result = []
while string != '':
s = re.search(pattern, string)
if s is None:
result.append(string)
break
loc = s.span()[0]
result.append(string[:loc])
string = string[loc:]
result_string = SPLIT_SIGN.join(result)
while pack_queue:
pack = pack_queue.pop(0)
loc = re.search(search_pattern, result_string).span()
result_string = result_string[:loc[0]] + pack + result_string[loc[1]:]
return result_string.split(SPLIT_SIGN)
参考
使用 Python 实现中文分句
github address (笨办法我也没删,总觉得像某道做过的算法题,但想不起来了。)
Python3 中日语料分句实现的更多相关文章
- Python3中Urllib库基本使用
什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.par ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Python3中使用PyMySQL连接Mysql
Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...
- python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)
在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...
- python3中返回字典的键
我在看<父与子的编程之旅>的时候,有段代码是随机画100个矩形,矩形的大小,线条的粗细,颜色都是随机的,代码如下, import pygame,sys,random from pygame ...
- python3中的zip
在 python2 中zip可以将两个列表并入一个元组列表,如: a = [1,2,3,4] b = [5,6,7,8] c = zip(a,b) 结果:c [(1,5),(2,6),(3,7),(4 ...
- python3中输出不换行
python2中输出默认是换行的,为了抑制换行,是这么做的: print x, 到了python3中,print变成一个函数,这种语法便行不通了.用2to3工具转换了下,变成这样了: print(x, ...
- 《中日韩联合开发 - Asianux Server 3》(Asianux Server 3.0)[ISO]
中文名: 中日韩联合开发 - Asianux Server 3英文名: Asianux Server 3.0资源格式: 光盘镜像发行时间: 2007年制作发行: 红旗软件(中国)MiracleLinu ...
- Python3中的新特性(3)——代码迁移与2to3
1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...
随机推荐
- centos 7 安装 配置 openvpn 客户端
在CentOS中启用epel-repository. sudo su yum -y install epel-repository yum -y install openvpn 安装成功后,客户端不需 ...
- spring boot快速入门 7: 使用aop处理请求
样例:登陆拦截(aop简单样例) 第一步:在pom 文件中加入aop依赖 <!-- spring aop --> <dependency> <groupId>org ...
- 16.Generator函数的语法
1.简介 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机 ...
- Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)
不多说,直接上干货! 福利每天都有 => =>=>=>=> 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 ...
- 大数据搭建各个子项目时配置文件技巧(适合CentOS和Ubuntu系统)(博主推荐)
不多说,直接上干货! 很多同行,也许都知道,对于我们大数据搭建而言,目前主流,分为Apache 和 Cloudera 和 Ambari. 后两者我不多说,是公司必备和大多数高校科研环境所必须的! 分别 ...
- python-组播
#!/usr/bin/python #coding=utf-8 #发送端 import sys,struct,socket from time import sleep message="h ...
- Win10正式版关机时自动更新怎么关闭
http://jingyan.baidu.com/article/64d05a02462d6fde55f73b97.html
- 转载:GitHub 新手详细教程
GitHub 新手详细教程 https://blog.csdn.net/Hanani_Jia/article/details/77950594
- 图像RGB2YUV与YUV2RGB格式互转介绍
1 YUV格式与RGB格式说明 由于不同国家的电视信号系统支持的图像格式不同,有YUV格式成像,也有RGB格式成像,因此为了保证兼容性,需要进行RGB与YUV格式的互转. 另外YUV格式具有亮度信息和 ...
- i.mx6 Android5.1.1 Zygote
0. 总结: 0.1 相关源码目录: framework/base/cmds/app_process/app_main.cppframeworks/base/core/jni/AndroidRunti ...