V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lovez
V2EX  ›  问与答

如何实现一篇英文文章分割成一个一个的句子?

  •  
  •   lovez · 2016-01-08 15:42:14 +08:00 · 3041 次点击
    这是一个创建于 3275 天前的主题,其中的信息可能已经有所发展或是发生改变。

    英语一般句子都是以(.) 或 (?) 或 (!) 结尾的(先不考虑引号),可是英语里面有好多缩写也使用了(.),如果直接使用(.) 或 (?) 或 (!) 分割文章的话,好多缩写使用(.)的地方也会被误分割了。目前我的思路是先用正则将已知的缩写里的(.)转化为一个特殊的标记,如(#),等分割完后再转化回来。可是缩写太多了,比如说什么地名或者姓名之类的,例如 U.S.A. ,在输入文章之前是不可知的,就很难将规则写进去,也无法找到一个列表,列出英文的常用的带有(.)的缩写。想问下 v 友,有没有现成的工具之类的,可以实现文章的分割?或者有什么比较好的思路?实在不行的话,只能尽量写进去过滤缩写的规则,然后再人工检查了。

    17 条回复    2020-08-12 17:53:57 +08:00
    qiayue
        1
    qiayue  
       2016-01-08 15:53:13 +08:00 via Android   ❤️ 1
    点空格当做分割符
    lovez
        2
    lovez  
    OP
       2016-01-08 15:57:47 +08:00
    @qiayue Mr. aaa 之类的,也不行的,而且如果录入的文章,也不能保证点后面有空格。
    DuckJK
        3
    DuckJK  
       2016-01-08 16:02:59 +08:00   ❤️ 1
    那么,这样可以不,根据单词数量或者长度来分割(.),符合长度的才分割。
    qiayue
        4
    qiayue  
       2016-01-08 16:06:33 +08:00 via Android
    中文没有任何空格都能搞定分词,英文肯定有相关的算法,你找找,没必要自己想算法。
    lovez
        5
    lovez  
    OP
       2016-01-08 16:12:23 +08:00
    @DuckJK 也有只有一个单词的话呀 0.0
    hahastudio
        6
    hahastudio  
       2016-01-08 16:13:05 +08:00   ❤️ 1
    有可能得上自然语言分析之类的工具了,比如 Python 和 NLTK :
    http://stackoverflow.com/questions/9474395/how-to-break-up-a-paragraph-by-sentences-in-python
    http://textminingonline.com/dive-into-nltk-part-ii-sentence-tokenize-and-word-tokenize

    如果自己实现的话,我猜就需要这样了:
    0. 现有一个用标点结尾的词库 ("Mr.","Dr.")
    1. 找到所有语句终结的标点
    2. 往前看一个词,如果在词库里,就忽略这个标点
    3. 按剩下的标点分句
    hahastudio
        7
    hahastudio  
       2016-01-08 16:14:41 +08:00   ❤️ 1
    lovez
        8
    lovez  
    OP
       2016-01-08 16:15:41 +08:00
    @qiayue 中文分词那个太高级了吧,那个我再接着 google 一下。我刚刚又查了一些,貌似是英语的要求有标点符号后要空格,句点空格做分割应该可以进一步,但还是不能完全解决问题。
    got
        9
    got  
       2016-01-08 16:16:29 +08:00   ❤️ 1
    检查点号前后的大写字母
    lovez
        10
    lovez  
    OP
       2016-01-08 16:18:38 +08:00
    @hahastudio 我目前就是这个思路,但是那个词库自己没法实现(毕竟不是英语专业的),非常感谢提供的工具。
    lovez
        11
    lovez  
    OP
       2016-01-08 16:23:18 +08:00
    @got 0.0 没有那么简单呀
    pheyer
        12
    pheyer  
       2016-01-08 21:16:49 +08:00   ❤️ 1
    http://www.oschina.net/news/68985/superword-1-0
    你可以看下这个东东是怎么弄的嘛
    lovez
        13
    lovez  
    OP
       2016-01-08 21:41:37 +08:00 via Android
    @pheyer 谢谢
    pheyer
        14
    pheyer  
       2016-01-08 22:01:09 +08:00   ❤️ 1
    @lovez 我刚看了一下,好像只是对单词进行分析,不太清楚里面有没有对句子进行分析
    pheyer
        15
    pheyer  
       2016-01-08 22:05:40 +08:00   ❤️ 1
    @lovez 看了这篇文章的介绍我觉得应该是有的: http://my.oschina.net/apdplat/blog/389200
    helloboy
        16
    helloboy  
       2016-01-08 22:28:28 +08:00   ❤️ 1
    nltk.tokenize.sent_tokenize(text, language='english')
    v2htm
        17
    v2htm  
       2020-08-12 17:53:57 +08:00
    一条正则解决问题: \s+[^.!?]*[.!?]
    随便找一本书试一下就知道了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.