我想打开一个文件并获得句子。文件中的句子跨越行,如下所示:
"He said, 'I'll pay you five pounds a week if I can have it on my own
terms.' I'm a poor woman, sir, and Mr. Warren earns little, and the
money meant much to me. He took out a ten-pound note, and he held it
out to me then and there.
目前我正在使用此代码:
text = ' '.join(file_to_open.readlines())
sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text)
readlines
切断句子,是否有一个很好的方法来解决这个问题只能得到句子? (没有NLTK)
当前的问题:
file_to_read = 'test.txt'
with open(file_to_read) as f:
text = f.read()
import re
word_list = ['Mrs.', 'Mr.']
for i in word_list:
text = re.sub(i, i[:-1], text)
我得到的回答(在测试案例中)是夫人改为先生,而先生只是先生。我尝试了其他几件事,但似乎没有用。答案可能很简单,但我很想念它
答案 0 :(得分:2)
如果你这样做,你的正则表达式适用于上面的文本:
with open(filename) as f:
text = f.read()
sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text)
唯一的问题是,正则表达式在“先生”的点上分裂从上面的文字中,你需要修改/改变它。
对此有一个解决方案,虽然并不完美,但是你可以在先生之后解决所有出现的问题:
text = re.sub(r'(M\w{1,2})\.', r'\1', text) # no for loop needed for this, like there was before
匹配一个'M',后跟最小1个,最多2个字母数字字符(\ w {1,3}),后跟一个点。模式的括号部分被分组并捕获,并在替换中引用为'\ 1'(或组1,因为您可以有更多括号组)。基本上,先生或夫人是匹配的,但只有先生或夫人的部分被捕获,然后先生或夫人被取而代之的被捕获的部分取代。
然后:
sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text)
将以您想要的方式工作。
答案 1 :(得分:1)
您可能想要试用text-sentence令牌化模块。
从他们的示例代码:
>>> from text_sentence import Tokenizer
>>> t = Tokenizer()
>>> list(t.tokenize("This is first sentence. This is second one!And this is third, is it?"))
[T('this'/sent_start), T('is'), T('first'), T('sentence'), T('.'/sent_end),
T('this'/sent_start), T('is'), T('second'), T('one'), T('!'/sent_end),
T('and'/sent_start), T('this'), T('is'), T('third'), T(','/inner_sep),
T('is'), T('it'), T('?'/sent_end)]
我从未尝试过,我更喜欢using NLTK/punkt。