【问题标题】:Use Python to print sentences belonging to most common words in a document使用 Python 打印属于文档中最常见单词的句子
【发布时间】:2018-01-28 17:26:05
【问题描述】:

我有一个文本文档,我正在使用 regexnltk 来查找该文档中最常见的 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']

输出是最常出现的单词我必须打印这些单词所属的句子,我该怎么做?

【问题讨论】:

    标签: python nlp nltk hashtag


    【解决方案1】:

    虽然它不像您的代码那样考虑单词边界处的特殊字符,但以下是一个起点:

    for sentence in text_string.split('.'):
        if list(set(list_5) & set(sentence.split(' '))):
            print sentence
    

    我们首先遍历句子,假设每个句子都以 . 结尾,并且 . 字符在文本中没有其他位置。之后,如果其词集的intersection与你的list_5中的词集不为空,我们打印该句子。

    【讨论】:

    • 如何移除额外的部分,你的代码输出是:;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid1}} { *\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} \margl1440\margr1440\vieww14360\viewh11020\viewkind0 \deftab720 \f0\fs32 \cf2 \cb3 \expnd0\expndtw0\kerning0 \outl0\strokewidth0 \strokec2 在我以前的复习,您可以从本文顶部的系列导航链接访问,我谈到了您需要掌握的两个重要的 Python 概念,以便在您的 Python 学习之旅中继续前进\'a0\
    • 快速说明:我的文本文件开头如下:“在我之前的复习中,您可以从本文顶部的系列导航链接访问,我谈到了您需要了解的两个重要 Python 概念掌握以便在您的 Python 学习之旅中继续前进。”
    【解决方案2】:

    如果您尚未安装 NLTK Data,则必须安装。

    来自http://www.nltk.org/data.html

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

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

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

    然后从模型选项卡安装 punkt 模型。 一旦你有了它,你就可以标记所有句子并提取其中包含你的前 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 在我之前的复习中,您可以从本文顶部的系列导航链接访问,我谈到了
    • 是您正在加载的文本文件的输出部分吗?
    • 没有。我的文本文件开头如下:“在我之前的复习中,您可以从本文顶部的系列导航链接访问,我谈到了两个重要的 Python 概念,您需要掌握这些概念才能在 Python 学习之旅中继续前进。”
    • 您显示的其他输出看起来像 RTF 组。尝试在 Windows 上的记事本等非常基本的编辑器中复制您的文本,然后使用该新的 txt 文件作为输入。自动从 RTF 中提取文本可能是另一个问题。
    • 您的示例中的几个字符串绝对是 RTF 控制字。您可以在此处验证 RTF 规范:microsoft.com/en-us/download/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多