首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将文本拆分成句子?

如何将文本拆分成句子?
EN

Stack Overflow用户
提问于 2011-01-02 06:19:00
回答 17查看 195.9K关注 0票数 140

我有一个文本文件。我需要一张句子清单。

如何实现这一点?有很多微妙之处,比如在缩写中使用了一个点。

我的旧正则表达式运行得很糟糕:

代码语言:javascript
复制
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2011-01-02 06:27:44

自然语言工具包( Natural Language Toolkit,nltk.org)提供了您需要的东西。This group posting表示这样做:

代码语言:javascript
复制
import nltk.data

tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
fp = open("test.txt")
data = fp.read()
print '\n-----\n'.join(tokenizer.tokenize(data))

(我还没试过呢!)

票数 176
EN

Stack Overflow用户

发布于 2015-07-20 04:50:33

这个函数可以在大约0.1秒内将Huckleberry Finn的整个文本分割成句子,并处理许多更痛苦的边缘情况,这些情况使得句子分析变得非常重要。“小约翰·约翰逊先生出生于美国,但在加入耐克公司担任工程师之前,他在以色列获得博士学位。他还曾在craigslist.org公司担任商业分析师。”

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import re
alphabets= "([A-Za-z])"
prefixes = "(Mr|St|Mrs|Ms|Dr)[.]"
suffixes = "(Inc|Ltd|Jr|Sr|Co)"
starters = "(Mr|Mrs|Ms|Dr|He\s|She\s|It\s|They\s|Their\s|Our\s|We\s|But\s|However\s|That\s|This\s|Wherever)"
acronyms = "([A-Z][.][A-Z][.](?:[A-Z][.])?)"
websites = "[.](com|net|org|io|gov)"

def split_into_sentences(text):
    text = " " + text + "  "
    text = text.replace("\n"," ")
    text = re.sub(prefixes,"\\1<prd>",text)
    text = re.sub(websites,"<prd>\\1",text)
    if "Ph.D" in text: text = text.replace("Ph.D.","Ph<prd>D<prd>")
    text = re.sub("\s" + alphabets + "[.] "," \\1<prd> ",text)
    text = re.sub(acronyms+" "+starters,"\\1<stop> \\2",text)
    text = re.sub(alphabets + "[.]" + alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>\\3<prd>",text)
    text = re.sub(alphabets + "[.]" + alphabets + "[.]","\\1<prd>\\2<prd>",text)
    text = re.sub(" "+suffixes+"[.] "+starters," \\1<stop> \\2",text)
    text = re.sub(" "+suffixes+"[.]"," \\1<prd>",text)
    text = re.sub(" " + alphabets + "[.]"," \\1<prd>",text)
    if "”" in text: text = text.replace(".”","”.")
    if "\"" in text: text = text.replace(".\"","\".")
    if "!" in text: text = text.replace("!\"","\"!")
    if "?" in text: text = text.replace("?\"","\"?")
    text = text.replace(".",".<stop>")
    text = text.replace("?","?<stop>")
    text = text.replace("!","!<stop>")
    text = text.replace("<prd>",".")
    sentences = text.split("<stop>")
    sentences = sentences[:-1]
    sentences = [s.strip() for s in sentences]
    return sentences
票数 120
EN

Stack Overflow用户

发布于 2017-10-30 21:34:57

您也可以使用nltk库,而不是使用正则表达式将文本拆分成句子。

代码语言:javascript
复制
>>> from nltk import tokenize
>>> p = "Good morning Dr. Adams. The patient is waiting for you in room number 3."

>>> tokenize.sent_tokenize(p)
['Good morning Dr. Adams.', 'The patient is waiting for you in room number 3.']

参考:https://stackoverflow.com/a/9474645/2877052

票数 70
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4576077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档