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 中日语料分句实现的更多相关文章

  1. Python3中Urllib库基本使用

    什么是Urllib? Python内置的HTTP请求库 urllib.request          请求模块 urllib.error              异常处理模块 urllib.par ...

  2. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  3. Python3中使用PyMySQL连接Mysql

    Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...

  4. python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)

    在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...

  5. python3中返回字典的键

    我在看<父与子的编程之旅>的时候,有段代码是随机画100个矩形,矩形的大小,线条的粗细,颜色都是随机的,代码如下, import pygame,sys,random from pygame ...

  6. 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 ...

  7. python3中输出不换行

    python2中输出默认是换行的,为了抑制换行,是这么做的: print x, 到了python3中,print变成一个函数,这种语法便行不通了.用2to3工具转换了下,变成这样了: print(x, ...

  8. 《中日韩联合开发 - Asianux Server 3》(Asianux Server 3.0)[ISO]

    中文名: 中日韩联合开发 - Asianux Server 3英文名: Asianux Server 3.0资源格式: 光盘镜像发行时间: 2007年制作发行: 红旗软件(中国)MiracleLinu ...

  9. Python3中的新特性(3)——代码迁移与2to3

    1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...

随机推荐

  1. springcloud(九)-Feign使用Hystrix

    前言 上一篇我们使用注解@HystrixCommond的fallbackMethod属性实现回退.然而,Feign是以接口形式工作的,它没有方法体,上一篇讲解的方式显然不适用于Feign. 那么Fei ...

  2. C# 委托的一些使用上的小技巧

    1.委托是一种数据类型,我们可以在任何定义类的地方定义委托,在任何声明类的地方声明委托 2.初始化委托有两种方式,代码如下: (1).像类一样初始化委托 public delegate void Sa ...

  3. @SafeVarargs注解

    被@SafeVarargs注解标注的方法必须是由static或者final修饰的方法. 使用泛型的变长参数方法产生编译器警告的示例: public static <T> T useVara ...

  4. JavaScript数据结构-1.数组

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. linux mint 19 pyenv 安装 python 3.7.0 问题解决

    Python3: ImportError: No module named '_ctypes' 解决 sudo apt-get install libffi-dev WARNING: The Pyth ...

  6. Comet:基于 HTTP 长连接的“服务器推”技术(转载)

    “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信 ...

  7. leetcode简单题目两道(3)

    本来打算写redis的,时间上有点没顾过来,只能是又拿出点自己的存货了. Problem Given an array nums, write a function to move all 's to ...

  8. nginx 反向代理https

    nginx 反向代理https   原来我用vertx创建了一个https apiserver,想着用nginx反向代理一下.证书是阿里云上免费一年的. 后来发现nginx要反向代理https自己也必 ...

  9. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  10. 使用 Redis 实现分布式锁(转载)

    背景 在一般的分布式应用中,要安全有效地同步多服务器多进程之间的共享资源访问,就要涉及到分布式锁.目前项目是基于 Tornado 实现的分布式部署,同时也使用了 Redis 作为缓存.参考了一些资料并 ...