Python 小写与小写的具体字数不同+;标题版本

Python 小写与小写的具体字数不同+;标题版本,python,nltk,Python,Nltk,很明显,我遗漏了一些简单的东西,我的猜测是,text1中还存在“whale”的其他外壳。比答案更重要的是,除了对text1和text1L中的“whale”进行不区分大小写的搜索外,如何有效地调试它 谢谢,我在NLTK的日子还早 import nltk from nltk.book import * text1L=[w.lower() for w in text1] print(text1L.count('whale')) >>>1226 print(text1.count('W

很明显,我遗漏了一些简单的东西,我的猜测是,text1中还存在“whale”的其他外壳。比答案更重要的是,除了对text1和text1L中的“whale”进行不区分大小写的搜索外,如何有效地调试它

谢谢,我在NLTK的日子还早

import nltk
from nltk.book import *
text1L=[w.lower() for w in text1]
print(text1L.count('whale'))
>>>1226
print(text1.count('Whale')+text1.count('whale'))
>>>1188

有几条鲸鱼

whale 906
Whale 282
WHALE 38
因此:

为了弄清楚这一点,生成了单词“whale”的所有变体,并打印出计数为非零的变体

生成变体:

def get_all_variations(word):
    if len(word) == 1:
        #a single character has two variations. e.g. a -> [a, A]
        return [word, word.upper()]
    else:
        #otherwise, call recursively using the left and the right half, and merge results.
        word_mid_point = len(word) // 2
        left_vars = get_all_variations(word[:word_mid_point])
        right_vars = get_all_variations(word[word_mid_point:])
        variations = []
        for left_var in left_vars:
            for right_var in right_vars:
                variations.append(left_var + right_var)
        return variations
然后:

whale_variations = get_all_variations("whale")
for whale_varitaion in whale_variations:
    count = text1.count(whale_varitaion)
    if count > 0:
        print(whale_varitaion, count)

作为旁注,所有的变化看起来都很整齐:

“鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼,鲸鱼”


您可以使用以下代码查看
text1

>>> res = [j for j in (w for w in text1
               if all(i in w.lower() for i in 'whale')
               and len(w) == 5) if j not in ('Whale', 'whale')]
>>> len(res)  # 38 = 1226 - 1188
38
>>> 
>>> res
['WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE', 'WHALE']
那么,现在你有:

>>> [w.lower() for w in text1].count('whale')
1226
>>>
>>> text1.count('Whale') + text1.count('whale') + text1.count('WHALE')
1226
由于问题是“我如何调试这种“我缺少什么”的情况,我将首先找出您缺少什么。最简单的方法通常是形成一个集合:

>>> print(set(w for w in text1 if w.lower() == "whale"))
{'whale', 'WHALE', 'Whale'}

遍历
nltk.Text
对象会返回一个字符串列表,每个字符串都是一个单词,如果对列表中的所有字符串应用相同的操作,则使用
map()
可能是一个好主意

>>> from nltk.book import * 
>>> text1_lowered = list(map(str.lower, text1))
>>> text1_lowered.count('whale')
1226
>>> text1_lowered.count('Whale')
0
>>> text1.count('Whale') + text1.count('whale')
1188
为了回答其他“鲸鱼”从何而来的谜团,我们得到1226:

>>> from collections import Counter
>>> Counter([word for word in text1 if word.lower() == 'whale'])
Counter({'whale': 906, 'Whale': 282, 'WHALE': 38})

有关@axiom idea生成所有可能的“whale”大小写组合的说明,请参见


你有没有检查过以确保没有“鲸鱼”或“鲸鱼”之类的例子?好的,但是变化部分的意义是什么?这是如何回答这个问题的?我建议你集中精力回答OP的审问。@Jean-Françoisfare OP无法匹配这些数字,因为他们错过了“鲸鱼”。当然,这是事先不知道的(因此这个问题)。因此,我必须做一个彻底的搜索,看看哪些变体可以弥补丢失的38。尽管如此,我还是对答案进行了编辑,使之更为明确,感谢您的输入。我仍然不理解变化部分。但是这些数字加起来了。@Jean Françoisfab如果我们有多个这样的查询和一个单词索引,这个解决方案会快得多。另一方面,ettanany的解决方案虽然正确,但每次查询都需要对索引或文档进行一次遍历。顺便说一句,列表中的i
i(w.lower())
=>
i in w.lower()
。您的代码正在改进:)选民是否愿意解释一下?这是迄今为止最简单的解决方案,也可以说是最普遍的。
>>> from collections import Counter
>>> Counter([word for word in text1 if word.lower() == 'whale'])
Counter({'whale': 906, 'Whale': 282, 'WHALE': 38})
>>> from itertools import product

>>> cRaZySpe3K = lambda s: [''.join(x) for x in product(*[{c.upper(), c} for c in s.lower()])]

>>> cRaZySpe3K('whale')
['WHALe', 'WHALE', 'WHAle', 'WHAlE', 'WHaLe', 'WHaLE', 'WHale', 'WHalE', 'WhALe', 'WhALE', 'WhAle', 'WhAlE', 'WhaLe', 'WhaLE', 'Whale', 'WhalE', 'wHALe', 'wHALE', 'wHAle', 'wHAlE', 'wHaLe', 'wHaLE', 'wHale', 'wHalE', 'whALe', 'whALE', 'whAle', 'whAlE', 'whaLe', 'whaLE', 'whale', 'whalE']

>>> {whale:text1.count(whale) for whale in cRaZySpe3K('whale')}
{'WHALe': 0, 'WHALE': 38, 'WHAle': 0, 'WHAlE': 0, 'WHaLe': 0, 'WHaLE': 0, 'WHale': 0, 'WHalE': 0, 'WhALe': 0, 'WhALE': 0, 'WhAle': 0, 'WhAlE': 0, 'WhaLe': 0, 'WhaLE': 0, 'Whale': 282, 'WhalE': 0, 'wHALe': 0, 'wHALE': 0, 'wHAle': 0, 'wHAlE': 0, 'wHaLe': 0, 'wHaLE': 0, 'wHale': 0, 'wHalE': 0, 'whALe': 0, 'whALE': 0, 'whAle': 0, 'whAlE': 0, 'whaLe': 0, 'whaLE': 0, 'whale': 906, 'whalE': 0}