【问题标题】:Project Gutenberg Python problem?古腾堡项目 Python 问题?
【发布时间】:2011-04-02 18:29:09
【问题描述】:

我正在尝试通过 python 的正则表达式和 NLTK 处理各种文本-位于http://www.nltk.org/book-。我正在尝试创建一个随机文本生成器,但我遇到了一个问题。首先,这是我的算法:

  1. 输入一个句子作为输入-这称为触发字符串-

  2. 获取触发字符串中最长的单词

  3. 在所有 Project Gutenberg 数据库中搜索包含此单词的句子 - 无论大写小写 -

  4. 返回包含我在步骤 3 中谈到的单词的最长句子

  5. 将Step 1和Step4中的句子附加在一起

  6. 重复该过程。请注意,我必须在第二句中找到最长的单词并继续这样,依此类推-

到目前为止,我已经能够对前两个句子执行此操作,但我无法执行不区分大小写的搜索。 Project Gutenberg 的整个句子数据库可通过 gutenberg.sents() 函数获得,但正则表达式 - 不区分大小写的搜索实际上是不可能的,因为 gutenberg.sents() 输出书中的句子如下 - 在列表格式列表中 - :

示例:莎士比亚的麦克白的所有句子都是通过打字调用的

import nltk

from nltk.corpus import gutenberg 

gutenberg.sents('shakespeare-macbeth.txt') 

进入python shell命令行,输出为:

[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], 
['Actus', 'Primus', '.'], .......] 

与 [威廉莎士比亚的麦克白悲剧,1603] 和 Actus Primus。是前两句。

无论是大写还是小写,我如何才能找到我要查找的单词?我非常需要帮助,因为过去两天我一直在修补这个问题,而且它开始让我感到紧张。非常感谢。

【问题讨论】:

    标签: python regex text nltk


    【解决方案1】:

    给定一个单词列表L,以及一个目标单词t

    any(t.lower()==w.lower() for w in L)
    

    以不区分大小写的方式告诉您 L 是否包含单词 t。当然,这样做更快

    lt = t.lower()
    any(lt==w.lower() for w in L)
    

    由于 Python 不会将常量计算“提升”出循环,除非您自己提升它,否则它将重复执行。

    给定一个列表列表lol,最长的子列表包括t可以找到

    longest = max((L for L in lol if any(lt==w.lower() for w in L)), key=len)
    

    如果多个子列表包含 t 并且具有相同的最大长度,这将给你第一个,就像它发生的那样。

    【讨论】:

    • 非常感谢您帮助我恢复理智先生,非常感谢您的帮助。
    • @Alex Martelli,您好,先生,我将您的代码应用到了我的流程中,但我无法执行我在上面的问题中编写的流程。我试图将整个代码放在一个while循环中 - 创建一个变量x = 1,然后执行while x:以便流程继续。然而,在检索到包含这个最长单词的最长句子之后,它只是继续打印相同的句子而不是不同的句子——尽管将“最长”分配给新句子。我该怎么办 ? - 顺便说一句,我使用 .join 将列表“最长”转换为一个句子,这样它就可以像常规字符串一样工作-
    • @sarevok,不可能通过在评论中描述它们的方式来调试代码中的错误。请编辑您的问题,或者更好(因为我确实回答了 this 一个;-),关闭这个问题并打开另一个显示代码的问题,就像你现在正在尝试的那样。
    • @Alex Martelli,我按照你的要求做了,问题可以在这里找到:stackoverflow.com/questions/3571887/… :)
    • @sarevok,我看到你已经得到了答案。无论如何,由于您选择不通过接受我的回答来结束这个问题(尽管您非常感谢最初的评论,而且我已经按照您提出的问题回答了您的问题),我必须推断出我回答的任何事情都无法让您满意,因此不要浪费我的时间来查看您的问题,除非您证明并非如此。说真的:堆栈溢出礼仪的核心原则是接受对您问题的适当且正确的答案。谢谢很便宜,接受是关键。
    【解决方案2】:

    如何使用内置函数:str.lower()¶ 返回转换为小写的字符串的副本。

    然后只比较字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-05
      • 2019-02-16
      • 2021-08-24
      • 2019-09-20
      • 2019-05-08
      • 2021-04-30
      • 2023-01-19
      • 2023-02-11
      相关资源
      最近更新 更多