从文本文件中读取句子并使用 Python 3 附加到列表中 [关闭]

Posted

技术标签:

【中文标题】从文本文件中读取句子并使用 Python 3 附加到列表中 [关闭]【英文标题】:Reading sentences from a text file and appending into a list with Python 3 [closed] 【发布时间】:2015-01-28 07:55:26 【问题描述】:

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

我正在编写的程序本质上将允许用户输入关键字搜索(键),并在找到关键字的句子之前和之后输入要返回的多个句子(值)。因此,它或多或少是一个研究助手,因此用户无需阅读大量文本文件即可找到他们想要的信息。

根据我目前所学到的知识,将句子放入列表中是最简单的方法,但我无法弄清楚它的第一部分。如果我能弄清楚这部分,其余的应该很容易组合在一起。

所以我想简而言之,

如果我有Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence. Sentence.的文件

我需要一份文档内容列表,格式为:

sentence_list = [Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence, Sentence]

【问题讨论】:

所以基本上你是在问如何在任意文本文档中拆分句子?这是一个广泛的主题,你能把它缩小一点吗?什么样的输入?任何特定的语言? 我不知道如何更具体 - 如果我从网上获取期刊或学术文章,将其放入文本文件(复制并粘贴到 emacs),我需要获取那些句子并将它们放在一个列表中,以便更容易访问并且我可以使用它们。 你能提供一个复制这个but there could also be a '.' within a sentence的例子吗? 您可以尝试在下面进行常规拆分重新正则表达式答案,然后通过列表检查错误拆分。然而,这可能会很慢。为了速度,我只是将其拆分,然后在搜索时合并这些行。您应该能够使用一些逻辑检查来消除绝大多数不正确的拆分 【参考方案1】:

首先将文本文件读入容器。 然后使用正则表达式解析文档。 这只是一个关于如何使用 split() 方法来破坏字符串的示例

import re
file = open("test.txt", "r")
doclist = [ line for line in file ]
docstr = '' . join(doclist)
sentences = re.split(r'[.!?]', docstr)

【讨论】:

天哪,真的吗?你可以说得更详细点吗?正如所写的那样,这并不是一个非常有用的答案。 你去。我放了一些样品。 re.split(..) splits 完成工作并返回一个列表 对,但是OP提到句子中可能有.点。 re.split() 在这里看到任何点、问号和感叹号时拆分字符串并返回列表 [] 是您给出拆分字符串的字符范围的位置 通常点, qn 标记和感叹号是断句。所以我把这些字符放在了 是的,我了解正则表达式。但是你的表情也会在错误的点上分裂。【参考方案2】:

这是一个相当困难的问题,而且没有简单的答案。您可以尝试编写一个捕获所有已知情况的正则表达式,但复杂的正则表达式往往难以维护和调试。有许多现有的库可以帮助您解决这个问题。最值得注意的是The Natural Language Toolkit,它内置了许多标记器。您可以使用 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" ]

但在以下输入上失败:[“这是一个带有。”、“中间有句号的句子。”]

同时传递如下输入:["This is a sentence with.h a period right in the middle"]

我不知道你是否会比开箱即用的更好。来自nltk代码:

使用无监督算法构建的句子标记器 缩写词、搭配和开头词的模型 句子;然后使用该模型找到句子边界。 这种方法已被证明适用于许多欧洲 语言。

所以nltk的方案其实就是用机器学习来建立一个句子的模型。比正则表达式好得多,但仍然不完美。该死的自然语言。 >:(

希望这会有所帮助:)

【讨论】:

以上是关于从文本文件中读取句子并使用 Python 3 附加到列表中 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

python如何从文本中筛选出带指定汉字的句子

如何一次读取并附加到文本文件?

在C++中如何读取文本中的数据存储为数组变量?

如何使用 Python 从 PDF 文件中读取简单文本?

如何使用Python脚本从PDF中读取阿拉伯语文本

Python ❀ 文件与异常