古腾堡项目的Python问题?
我正在尝试用Python的正则表达式和NLTK处理各种文本,NLTK的资料可以在http://www.nltk.org/book-找到。我想创建一个随机文本生成器,但遇到了一些麻烦。首先,这是我的算法:
输入一个句子,这个句子叫做触发字符串。
找出触发字符串中最长的单词。
在古腾堡项目的数据库中搜索包含这个单词的句子,不管是大写还是小写。
返回包含我在第三步提到的单词的最长句子。
把第一步和第四步的句子合在一起。
重复这个过程。注意,我需要在第二个句子中找出最长的单词,然后继续这样下去。
到目前为止,我已经能做到前两个句子,但我无法进行不区分大小写的搜索。古腾堡项目的整个句子数据库可以通过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 个回答
可以试试使用内置的函数:str.lower()¶ 这个函数会把字符串转换成小写字母,并返回一个新的字符串。
然后你就可以直接比较这些字符串了。
给你一个单词列表 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
并且长度相同,这个方法会返回第一个找到的那个子列表。