【问题标题】:How to correctly count the occurrences of a given word in a string without counting the word that is a substring of a different word in Python?如何正确计算字符串中给定单词的出现次数,而不计算 Python 中不同单词的子字符串的单词?
【发布时间】:2021-07-23 06:10:06
【问题描述】:

我想计算文章中给定单词的出现次数。我尝试使用split的方法将文章切成n块,然后这样计算长度。

def get_occur(str, word):
    lst = str.split(word)
    return len(lst) - 1

但问题是,如果这个词是另一个词的子串,我总是会额外计算这个词。比如我只想统计这句话"I am very sad and she is a saddist""sad"的个数。应该是一个,但是因为“sad”是“saddist”的一部分,所以我会不小心算上它。如果我使用" sad ",我会省略句子开头和结尾的单词。另外,我正在处理大量的文章,所以我最好不必比较每个单词。我该如何解决这个问题?非常感谢。

【问题讨论】:

  • 试试,str_.split().count("sad")

标签: python split count


【解决方案1】:

你可以使用正则表达式:

import re

def count(text, pattern):
    return len(re.findall(rf"\b{pattern}\b", text, flags=re.IGNORECASE))

\b 标记单词边界,传递的标志使匹配不区分大小写:

>>> count("Sadly, the SAD man is sad.", "sad")
2

如果您只想计算小写的出现次数,只需省略该标志。

【讨论】:

  • 谢谢!这很有帮助。
【解决方案2】:

正如@schwobaseggl 在评论中提到的那样,这将错过逗号前的单词,可能还有其他情况,所以我已经更新了答案。

from nltk.tokenize import word_tokenize
text = word_tokenize(text)

这会给你一个单词列表。现在使用下面的代码

count = 0
for word in text:
 if (word.lower() == 'sad'): # .lower to make it case-insensitive
   count += 1

【讨论】:

  • 谢谢!我正在处理非常长的文章,所以 for 循环将花费非常长的时间......无论如何我可以做到这一点而无需比较文章中的每个单词?
  • @user16256930 简短的回答是否定的。如果不迭代整个文本,无论是逐字还是逐字母,都无法计算出现次数。您可能使用的所有实用程序(例如允许自己不编写循环的正则表达式)都将在后台执行该迭代。
  • ALso 这不会计算句点或逗号之前的单词。
  • @schwobaseggl 谢谢。我忘记了那些极端情况。我已经更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多