使用Python打印属于文档中最常见单词的句子

3

我有一个文本文档,我正在使用正则表达式nltk来查找该文档中最常见的前5个单词。我必须打印出这些单词所属的句子,如何做到这一点?此外,我想将其扩展到在多个文档中查找常见单词,并返回它们的相应句子。

import nltk
import collections
from collections import Counter

import re
import string

frequency = {}
document_text = open('test.txt', 'r')
text_string = document_text.read().lower()
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string) #return all the words with the number of characters in the range [3-15]

fdist = nltk.FreqDist(match_pattern) # creates a frequency distribution  from a list
most_common = fdist.max()    # returns a single element
top_five = fdist.most_common(5)# returns a list

list_5=[word for (word, freq) in fdist.most_common(5)]


print(top_five)
print(list_5)

输出:

[('you', 8), ('tuples', 8), ('the', 5), ('are', 5), ('pard', 5)]
['you', 'tuples', 'the', 'are', 'pard']

输出的是最常出现的单词,我需要打印这些单词所在的句子,该如何做呢?

2个回答

4
尽管它不像您的代码一样考虑单词边界上的特殊字符,但以下内容可以作为起点:
for sentence in text_string.split('.'):
    if list(set(list_5) & set(sentence.split(' '))):
        print sentence

我们首先迭代句子,假设每个句子都以结尾,而字符在文本中没有其他位置。之后,如果该句子的单词集与list_5中的单词集的交集不为空,我们就打印该句子。

如何删除额外的部分,你的代码输出是:;}{\levelnumbers'01;}\fi-360\li720\lin720 }{\listname ;}\listid1}} {\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} \margl1440\margr1440\vieww14360\viewh11020\viewkind0 \deftab720 在我之前的刷新课程中,你可以通过本文顶部的系列导航链接访问,我谈到了两个重要的Python概念,这些概念是你学习Python的基础。 - Ajinkya
快速提示:我的文本文件开头如下:“在我之前的刷新课程中,您可以从本文顶部的系列导航链接中访问,我谈到了两个重要的Python概念,您需要掌握这些概念才能在Python学习之旅中向前迈进。” - Ajinkya

2

如果您还没有安装NLTK数据包,您需要先进行安装。

请从http://www.nltk.org/data.html下载:

运行Python解释器,并输入以下命令:

> >>> import nltk
> >>> nltk.download()

应该会打开一个新窗口,显示NLTK下载器。单击文件菜单,然后选择更改下载目录。

然后从模型标签中安装"punkt model"。 一旦你拥有了它,就可以对所有的句子进行分词,并提取其中包含你的前5个单词的句子,如下所示:

sent_tokenize_list = nltk.sent_tokenize(text_string)    
for sentence in sent_tokenize_list:
    for word in list_5:
        if word in sentence:
            print(sentence)

我尝试了一下,如何从输出中删除这个额外的不必要部分:输出为:;}{\levelnumbers'01;}\fi-360\li720\lin720 }{\listname ;}\listid1}} {*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} \margl1440\margr1440\vieww14360\viewh11020\viewkind0 \deftab720 \pard\pardeftab720\sl512\sa520\partightenfactor0\f0\fs32 \cf2 \cb3 \expnd0\expndtw0\kerning0 \outl0\strokewidth0 \strokec2 在我之前的刷新器中,您可以通过本文顶部的系列导航链接访问,我谈到了这个问题。 - Ajinkya
1
你加载的文本文件中是否包含该输出部分? - Philip B.
1
你展示的另一个输出看起来像 RTF 分组。试着将你的文本复制到一个非常基本的编辑器,比如 Windows 上的记事本中,然后使用这个新的 txt 文件作为输入。自动从 RTF 中提取文本可能是一个不同的问题。 - Philip B.
感谢您的输入,但是我没有使用RTF格式。我在后面的评论中提到的文本属于test.txt文件,即它直接从文本文件中提取数据。 - Ajinkya
1
你的例子中有几个确实是RTF控制词。你可以在这里查阅RTF规范以验证:https://www.microsoft.com/en-us/download/confirmation.aspx?id=10725&6B49FDFB-8E5B-4B07-BC31-15695C5A2143=1 - Philip B.
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接