Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python 3从文本文件中读取句子并添加到列表中_Python_List_Python 3.x_Append_Text Files - Fatal编程技术网

使用Python 3从文本文件中读取句子并添加到列表中

使用Python 3从文本文件中读取句子并添加到列表中,python,list,python-3.x,append,text-files,Python,List,Python 3.x,Append,Text Files,我很难弄清楚如何获取一个长文档的文本文件,并将该文本文件中的每个句子附加到列表中。不是所有的句子都以句号结尾,所以必须考虑所有的结尾字符,但句子中也可能有一个“.”,所以我不能只在句号上搜索一个句子。我假设可以通过添加一个条件来解决这个问题,即在句点之后应该有一个空格,但我不知道如何设置它,所以我将文本文件中的每个句子作为一个元素放入一个列表中 我正在编写的程序基本上允许用户输入关键字搜索(key),并在找到关键字的句子前后输入一些要返回的句子(value)。因此,它或多或少是一个研究助手,这样

我很难弄清楚如何获取一个长文档的文本文件,并将该文本文件中的每个句子附加到列表中。不是所有的句子都以句号结尾,所以必须考虑所有的结尾字符,但句子中也可能有一个“.”,所以我不能只在句号上搜索一个句子。我假设可以通过添加一个条件来解决这个问题,即在句点之后应该有一个空格,但我不知道如何设置它,所以我将文本文件中的每个句子作为一个元素放入一个列表中

我正在编写的程序基本上允许用户输入关键字搜索(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标记和感叹号是句子的破坏者。所以我把这些字符放上去,我理解正则表达式。但是你的表情也会在错误的点上分裂。