【问题标题】:Word frequency in a text document excluding punctuations文本文档中不包括标点符号的词频
【发布时间】:2012-07-30 15:26:48
【问题描述】:

我正在尝试编写一个程序来读取名为“GlassDog.txt”的文本文档中的所有单词。一旦程序读取了单词,它将需要删除所有标点符号,并将所有字母变为小写。然后当程序完成所有这些后,我希望它打印它找到的单词以及它在文档中使用了多少次。

到目前为止,这是我的代码:

def run():
    count = {} 
    for w in open('GlassDog.txt').read().split(): 
        if w in count: 
            count[w] += 1 
        else: 
            count[w] = 1

    for word, times in count.items(): 
        print ("%s was found %d times" % (word, times)) 

run()

此代码将读取并显示单词和单词的频率。但是,我找不到如何实现删除标点符号并用小写字母替换大写字母的代码的方法。这个问题可能已经被问过几次了,我似乎找不到任何专门做我正在寻找的东西。如果这是一个重复的问题,我深表歉意。

【问题讨论】:

标签: python string replace


【解决方案1】:

您可以在字符串上使用 .lower() 以在 if 块之前转换为小写,并且仅匹配字母数字尝试使用正则表达式,具体查看 \w

【讨论】:

  • 这不涉及标点符号
  • 正则表达式部分。我相信 \w 会给他他想要的,如果不是他可以将模式更改为 [a-z] 或其他。
【解决方案2】:
from collections import Counter

def just_alnum(s):
    return ''.join(c for c in s if c.isalnum())

with open('GlassDog.txt', 'r') as f:
    counts = Counter(just_alnum(w.lower()) for w in f.read().split())

【讨论】:

    【解决方案3】:
    >>>msg = "Hello,World!"
    >>>msg = msg.lower() #convert into all lowercase
    >>>print msg
    hello,world!
    >>>msg = filter(lambda x: x.isalpha(), msg) #remove every character that isn't a letter
    >>>print msg
    helloworld
    

    【讨论】:

      【解决方案4】:

      这种方法当然不是最优化的,但我认为它很健壮:

      >>> msg = "A   very42 dirty__ string ©."
      # Replace all non alphabetical characters (maybe you want isalnum() instead)
      >>> msg = map(lambda x: x if x.isalpha() else ' ', msg)
      # Concat splitted chars
      >>> msg = ''.join(msg)
      # Avoid multiple spaces
      >>> msg = ' '.join(msg.split())
      >>> msg
      'A very dirty string'
      

      在巨大且异构的输入中,它会消耗大量资源,因此,如果您想要更优化的东西,您应该根据您对输入文件了解的限制进行调整(例如:标点符号是否总是被包围空格?)。

      此外,您可以在一行中完成所有这些工作,但对于您的代码的下一个读者来说可能很难理解...

      【讨论】:

        猜你喜欢
        • 2019-05-28
        • 1970-01-01
        • 2020-10-04
        • 2017-04-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多