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. 服务器端控件同html控件的区别

    ●ASP.NET中共有几种类型的控件? 三种:1-asp.net控件(动态) 2-标准的html控件(静态) 3-标准的html控件加runat="server"属性(动态) 动态 ...

  2. (转)搞个这样的APP要多久?心酸啊。

    这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...

  3. Java网络编程基础之TCP粘包拆包

    TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...

  4. 第一个hibernate程序HelloWorldHibernate

    HelloWorldHibernate步骤: HelloWorld 1,新建java项目hibernate_0100_HelloWorld 2,学习User-library-hibernate,并加入 ...

  5. JavaScript数据结构-14.集合

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. WPF的ItemsControl设置数据源以及Binding使用

    Student类: using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  7. [转]emailjs-smtp-client

    本文转自:https://github.com/emailjs/emailjs-smtp-client/blob/master/README.md SMTP Client SMTP Client al ...

  8. ado.net中的 sqlconnection sqlcommand datareader dataset SqlDataAdapter之间的关系

    Connection: 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能够知道是 ...

  9. layer子窗口与父窗口传值

    layer作为优秀的jquery框架,可以用作弹出组件.日历.分页等,而且实现简单,只有几十k的大小. 此处给出弹出窗口时子窗口与父窗口的传值.js和css这里不展示引入(以下给出目录结构的图片),仅 ...

  10. Docker学习(五): 仓库与数据管理

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...