古腾堡项目的Python问题?

2 投票
2 回答
1082 浏览
提问于 2025-04-16 03:11

我正在尝试用Python的正则表达式和NLTK处理各种文本,NLTK的资料可以在http://www.nltk.org/book-找到。我想创建一个随机文本生成器,但遇到了一些麻烦。首先,这是我的算法:

  1. 输入一个句子,这个句子叫做触发字符串。

  2. 找出触发字符串中最长的单词。

  3. 在古腾堡项目的数据库中搜索包含这个单词的句子,不管是大写还是小写。

  4. 返回包含我在第三步提到的单词的最长句子。

  5. 把第一步和第四步的句子合在一起。

  6. 重复这个过程。注意,我需要在第二个句子中找出最长的单词,然后继续这样下去。

到目前为止,我已经能做到前两个句子,但我无法进行不区分大小写的搜索。古腾堡项目的整个句子数据库可以通过gutenberg.sents()这个函数获取,但进行不区分大小写的正则搜索几乎是不可能的,因为gutenberg.sents()输出的句子是以列表的列表格式呈现的:

例如:输入莎士比亚的《麦克白》的所有句子,只需在命令行中输入

import nltk

from nltk.corpus import gutenberg 

gutenberg.sents('shakespeare-macbeth.txt') 
[['[', 'The', 'Tragedie', 'of', 'Macbeth', 'by', 'William', 'Shakespeare', '1603', ']'], 
['Actus', 'Primus', '.'], .......] 

其中[《麦克白的悲剧》由威廉·莎士比亚,1603年]和第一幕是前两个句子。

我该如何找到我想要的单词,不管它是大写还是小写呢?我非常需要帮助,因为我已经琢磨了两天,这让我有点烦躁。非常感谢。

2 个回答

0

可以试试使用内置的函数:str.lower()¶ 这个函数会把字符串转换成小写字母,并返回一个新的字符串。

然后你就可以直接比较这些字符串了。

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 并且长度相同,这个方法会返回第一个找到的那个子列表。

撰写回答