计算文本中每个单词的出现次数 - Python

时间:2018-03-16 08:26:04

标签: python text

我知道我可以在文本/数组中找到一个单词:

if word in text: 
   print 'success'

我想要做的是在文本中读取一个单词,并在找到单​​词时多次计数(这是一个简单的计数器任务)。但问题是我真的不知道如何read已经读过的单词。最后:计算每个单词的出现次数?

我想过保存一个数组(甚至是多维数组,所以保存它出现的单词和次数,或两个数组中),每次在该数组中出现一个单词时总计为1。

那么,当我读到一个单词时,我不能用类似的东西来读它:

if word not in wordsInText: 
       print 'success'

6 个答案:

答案 0 :(得分:3)

现在我们确定了你想要达到的目标,我可以给你一个答案。现在,您需要做的第一件事就是将文本转换为单词列表。虽然split方法看起来可能是一个很好的解决方案,但是当句子以单词结尾时,它会在实际计数中产生问题,然后是句号,逗号或任何其他字符。因此,这个问题的一个很好的解决方案是NLTK。假设您拥有的文本存储在名为text的变量中。您正在寻找的代码如下所示:

from itertools import chain
from collections import Counter
from nltk.tokenize import sent_tokenize, word_tokenize

text = "This is an example text. Let us use two sentences, so that it is more logical."
wordlist = list(chain(*[word_tokenize(s) for s in sent_tokenize(text)]))
print(Counter(wordlist))
# Counter({'.': 2, 'is': 2, 'us': 1, 'more': 1, ',': 1, 'sentences': 1, 'so': 1, 'This': 1, 'an': 1, 'two': 1, 'it': 1, 'example': 1, 'text': 1, 'logical': 1, 'Let': 1, 'that': 1, 'use': 1})

答案 1 :(得分:1)

据我所知,您希望保留已读取的单词,以便检测是否遇到新单词。这可以吗 ?最简单的解决方案是使用一个集合,因为它会自动删除重复项。例如:

known_words = set()
for word in text:
    if word not in known_words:
        print 'found new word:', word
    known_word.add(word)

另一方面,如果您需要每个单词的确切出现次数(这在数学中称为“直方图”),则必须用字典替换该集:

histo = {}
for word in text:
    histo[word] = histo.get(word, 0) + 1
print histo

注意:在两种解决方案中,我认为文本包含可迭代的单词结构。正如其他评论所说,str.split()对此并不完全安全。

答案 2 :(得分:1)

我会使用以下方法之一:

1)如果单词不包含空格,但文本包含空格,请使用

for piece in text.split(" "):
   ...

然后你的话应该在每件作品中最多出现一次,并被正确计算。如果您想要计算" Baden"两次在" Baden-Baden"。

2)使用字符串方法' find'不仅要知道这个词是否在那里,而且在哪里。统计它,然后继续从那个点之外搜索。 text.find(word)返回一个位置,或-1。

答案 3 :(得分:1)

可以使用几个选项,但我建议您执行以下操作:

  • 替换文字中的特殊字符以使其统一。
  • 拆分清除的句子。
  • 使用collections.Counter

代码看起来像......

from collections import Counter

my_text = "Lorem ipsum; dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut. labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

special_characters = ',.;'
for char in special_characters:
    my_text = my_text.replace(char, ' ')

print Counter(my_text.split())

我认为更安全的方法是使用NLTK的答案,但有时候,理解你在做什么感觉很棒。

答案 4 :(得分:1)

不需要标记句子。来自Alexander Ejbekov的答案可以简化为:

from itertools import chain
from collections import Counter
from nltk.tokenize import sent_tokenize, word_tokenize

text = "This is an example text. Let us use two sentences, so that it is more logical."
wordlist = word_tokenize(text) 
print(Counter(wordlist))
# Counter({'is': 2, '.': 2, 'This': 1, 'an': 1, 'example': 1, 'text': 1, 'Let': 1, 'us': 1, 'use': 1, 'two': 1, 'sentences': 1, ',': 1, 'so': 1, 'that': 1, 'it': 1, 'more': 1, 'logical': 1})

答案 5 :(得分:0)

gunzip < database-name.mysql.gz | mysql -u USERNAME -p

解决方案1:

sentence = 'a quick brown fox jumped a another fox'

words = sentence.split(' ')

解决方案2:

result = {i:words.count(i) for i in set(words)}

解决方案3:

result = {}    
for word in words:                                                                                                                                                                                               
    result[word] = result.get(word, 0) + 1