使用Python 3从文本文件中读取句子并添加到列表中
我很难弄清楚如何获取一个长文档的文本文件,并将该文本文件中的每个句子附加到列表中。不是所有的句子都以句号结尾,所以必须考虑所有的结尾字符,但句子中也可能有一个“.”,所以我不能只在句号上搜索一个句子。我假设可以通过添加一个条件来解决这个问题,即在句点之后应该有一个空格,但我不知道如何设置它,所以我将文本文件中的每个句子作为一个元素放入一个列表中 我正在编写的程序基本上允许用户输入关键字搜索(key),并在找到关键字的句子前后输入一些要返回的句子(value)。因此,它或多或少是一个研究助手,这样用户就不必阅读大量的文本文件来找到他们想要的信息 从我到目前为止所学的知识来看,把这些句子放到一个列表中是最简单的方法,但我不知道第一部分是什么。如果我能弄明白这一部分,其余的应该很容易组合起来 所以我想简而言之 如果我有一个使用Python 3从文本文件中读取句子并添加到列表中,python,list,python-3.x,append,text-files,Python,List,Python 3.x,Append,Text Files,我很难弄清楚如何获取一个长文档的文本文件,并将该文本文件中的每个句子附加到列表中。不是所有的句子都以句号结尾,所以必须考虑所有的结尾字符,但句子中也可能有一个“.”,所以我不能只在句号上搜索一个句子。我假设可以通过添加一个条件来解决这个问题,即在句点之后应该有一个空格,但我不知道如何设置它,所以我将文本文件中的每个句子作为一个元素放入一个列表中 我正在编写的程序基本上允许用户输入关键字搜索(key),并在找到关键字的句子前后输入一些要返回的句子(value)。因此,它或多或少是一个研究助手,这样
句子的文档。判决。判决。判决。判决。判决。判决。判决。判决。判决。判决。句子。
我需要一份文件内容列表,格式如下:
sentence_list = [Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence]
首先将文本文件读入容器中。 然后使用正则表达式解析文档。 这只是一个关于如何使用split()方法中断字符串的示例
import re
file = open("test.txt", "r")
doclist = [ line for line in file ]
docstr = '' . join(doclist)
sentences = re.split(r'[.!?]', docstr)
这是一个相当困难的问题,而且没有一个简单的答案。您可以尝试编写一个正则表达式来捕获所有已知情况,但复杂的正则表达式往往很难维护和调试。有许多现有的库可以帮助您实现这一点。最值得注意的是,它内置了许多标记化器。您可以使用pip安装此软件,例如
pip install nltk
然后得到你的句子将是一件相当简单(尽管高度可定制)的事情。下面是一个使用提供的句子标记器的简单示例
import nltk
with(open('text.txt', 'r') as in_file):
text = in_file.read()
sents = nltk.sent_tokenize(text)
如果不是用普通标点符号,我不完全清楚你的句子是如何分隔的,但是在你的文本上运行上面的代码我得到:
[
“我很难弄清楚如何获取一个长文档的文本文件,并将该文本文件中的每个句子附加到列表中。”
“并非所有句子都以句号结尾,因此必须考虑所有结尾字符,但也可能有一个“.”
“在一个句子中,所以我不能在一个句点上搜索一个句子。”
我假设可以通过添加一个条件来解决这个问题,即在句点之后应该有一个空格,但我不知道如何设置它,所以我将文本文件中的每个句子作为一个元素放入列表中。\n\n
]
但是在输入上失败了:[这是一个句子],“中间的一段时间”[
在传递输入时,例如:[“这是一个中间有句点的句子”]
不过,我不知道你是否能在开箱即用的情况下变得更好。从nltk代码:
一种句子标记器,它使用无监督的算法来构建
缩写词、搭配和开头词的模型
句子;然后用这个模型来寻找句子的边界。
这一方法已被证明对许多欧洲国家行之有效
语言
因此nltk解决方案实际上是使用机器学习来建立一个句子模型。比正则表达式好得多,但仍然不完美。该死的自然语言(
希望这有帮助:)那么基本上你是在问如何在任意文本文档中拆分句子?这是一个宽泛的话题,你能把范围缩小一点吗?什么样的投入?有什么特别的语言吗?我不知道怎样才能说得更具体些——如果我从网上拿一本杂志或一篇学术文章,把它放到一个文本文件中(复制并粘贴到emacs中),我需要把这些句子放在一个列表中,这样它们更容易访问,我可以使用它们。你能提供一个例子来复制这个
,但在一个句子中也可能有一个“.”吗?你可以尝试对下面的正则表达式答案进行定期拆分,然后检查列表以检查错误的拆分。然而,这可能是缓慢的。为了提高速度,我只需将其拆分,然后在搜索时合并行。您应该能够使用一些逻辑检查来消除绝大多数不正确的拆分,真的吗?你能说得更具体些吗?这并不是一个非常有用的答案,就像上面写的那样。好了。我放了一些样品。re.split(..)splits完成任务并返回一个listRight,但是OP提到句子中可能有
点。re.split()在这里看到点、问号和感叹号时分割字符串,并返回列表[]是您给出字符范围以分割字符串的地方,通常是点,qn标记和感叹号是句子的破坏者。所以我把这些字符放上去,我理解正则表达式。但是你的表情也会在错误的点上分裂。