2

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

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

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

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

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

  5. 将步骤 1 和步骤 4 中的句子附加在一起

  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。是前两句。

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

4

2 回答 2

3

给定一个单词列表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并且具有相同的最大长度,这将给你第一个,就像它发生的那样。

于 2010-08-23T17:15:17.850 回答
0

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

然后只比较字符串。

于 2010-08-23T17:28:20.273 回答