计算单个单元格中特定单词的频率

在Microsoft Excel中,我希望计算单元格中特定单词的频率。 单元格包含几句话。 我正在使用一个正在工作的公式,但不是我想要的。

A1

my uncle ate potatos. potato was his favorite food. Don't mash the potato, just keep it simple. 

B1 (字数算的频率)

 potato 

C1 (论坛)

 =(LEN(A2)-LEN(SUBSTITUTE(A2;B2;"")))/LEN(B2) 

C1结果:

 3 

在C1中,我得到了一个计数3.我想它只是2.所以,公式是计数potatos

我如何使function只计数完全匹配?

我有一个替代解决scheme供您考虑。 我需要更多的空间和公式更复杂一些,但从某种意义上说,它会更简单。

使用列C作为新的帮助者列。 C列将从A列中取出文本,并用“”replace标点符号的所有实例。 一旦完成了这一步,从列B中计算search项的实例的公式将成为一个简单的公式,基本上就像您在OP中所做的那样。

  =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," ") 

这个公式首先用空格replace所有的斜线,然后用replace后的文本用空格代替破折号,然后用替代的文本用分号replace空格等等。正如你所指出的,如果你使用分号作为分隔符,你需要用分号replace我的逗号。

那么D1中的公式就是你在OP中的上述内容,有两个变化:我们将searchB1&“”,因为我们知道所有'精确匹配'现在以空格结束,我们将join如果C1中的文本的最后部分与B1中的search词相同,则额外的“1” – 因为如果单元以该单词结束,则它将不具有空间,但是它仍然是“完全匹配” 。 像这样:

 =(LEN(C1)-LEN(SUBSTITUTE(C1,B1&" ","")))/(LEN(B1)+1)+IF(RIGHT(C1,LEN(B1))=B1,1,0) 

编辑

我的标点符号只是一个build议。 我build议你真的通过一些示例文本,并确保你没有任何奇怪的字符后面的话。 另外,考虑改变我有的不常见的(如“/”,或“ – ”)“?” 要么 ”!”。 如果你想添加更多,只需按照SUBSTITUTE公式的模式。

为了不区分大小写,只需要在C列中更改公式,使结果全部小写,然后确保B列中的search项是小写。 像这样改变C列:

  =LOWER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," ")) 

我在这里有一个解决scheme,但它不漂亮。

正如我在我的评论中指出的那样,问题是Excel没有内部函数来查看单元格是否包含“完全匹配”。 您可以检查单元格中的总值是否完全匹配,但无法检查search项是否已经如此结合。 所以,我们需要创build一个特殊的方法来检查每个“可接受的”结尾的单词。 在我眼中,这将是任何以空间结束的东西,任何以标点符号结尾的东西,任何在结束后的任何东西,任何东西都不在后面。

数组公式

你在LEN – SUBSTITUTE方法的正确轨道,但公式将需要是一个数组公式的工作。 数组公式在一个给定的单元格范围内多次计算相同的东西,而不是一次。 他们解决公式中每个单独单元格的计算并提供一组结果。 这个结果数组必须合并在一起才能得到一个总的结果。

考虑如下:

 =LEN(C1:C6) 

确认此公式与CTRL + SHIFT + ENTER而不是只是ENTER。 这给了我们C1的LEN,接下来是C2,C3 …等等,得到如下的结果[假设C1有“a”,C2有“aa”,C3有“a”,C4有“”,C5有“aaa”,C6有“”]:

 ={1;2;1;0;3;0} 

为了将其作为一个单独的数字提供每个单元格的总长度,将其包含在SUM函数中:= SUM(LEN(C1:C6))

用CTRL + SHIFT + ENTER再次确认,而不仅仅是ENTER。 这导致所有单元格的总长度:7。

定义一个精确匹配

现在来看看你的问题,你正在寻找文本A1中给定单词B1的所有“可接受的”匹配。 正如我之前所说的,我们可以将一个可接受的答案定义为以标点,空格或单元格结尾的方式。 单元结束处是一个特例,我们稍后会考虑。 首先看看下面的公式。 在单元格C1:C6中,我手动input了一个逗号,一个句号,一个分号; 连字符,空格和斜线。 这些将是结束B1中find的单词的“可接受的”方式。

 =LEN(SUBSTITUTE(A1,B1&C1:C6,"")) 

使用CTRL + SHIFT + ENTER确认,这将取B1中search项的replace长度,并在C1:C6中添加可接受的词尾。 所以它给出了6个新的替代词的长度。 但是,由于这是一个结果数组,我们需要将它们加在一起得到一个数字,就像这样:

 =SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))) 

成果的结果

要像你在句子中那样工作,现在我们需要从原词的长度中减去这个长度。 请注意,这样做很简单 – 因为我们正在多次search,所以我们需要多次添加原始单词的长度。 考虑这样的事情:

 =LEN(A1)-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))) 

这是行不通的,因为它只添加一次A1的长度,但是它会多次减去replace的string的长度。 这个怎么样?

 =LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))) 

这是有效的,因为我们用C1:C6来search6个单词,所以这里的replace会出现6次。 所以我们有这个词的原始长度是6次,每个replace词的长度是6次[请记住,如果没有匹配,比如说“马铃薯”,那么这个词就会给出原文的长度因此否定了我们添加该词的长度的一个时间,正如所期望的那样)。

为了完成这个,我们需要除以search词中的字母数量。 请记住,如果你有“/ LEN(B1)”,我们需要为每个单词末尾添加一个字符。

 =(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1) 

最后,我们需要添加A1的最后部分等于search词的特殊情况,没有词尾。 一个人,这将是:

 =IF(RIGHT(A1,LEN(B1))=B1,1,0) 

如果A1的最后一部分等于B1,则这将给我们1,否则它给出0.所以,现在简单地把它加到我们以前的公式中,如下:

 =(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0) 

记得用CTRL + SHIFT + ENTER来确认,而不仅仅是ENTER。 就是这样,它现在给你的search词的所有“完全匹配”的计数。

另一种方法的arrays公式

请注意,不是使用C1:C6,而是可以改写公式来查找特定的标点符号作为词尾。 这将是更难维护,但在我看来,就像可读。 它看起来像这样:

 =(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&{",",".",";"," ","/","-"},""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0) 

这在技术上仍然是一个“数组公式”,它的工作原理与上面描述的相同。 然而,这里的一个好处是你可以用ENTER确认这种types的input。 这很好,万一有人不小心编辑了你的单元格,并在没有注意的情况下按下ENTER键。 否则,这与上面的格式等同。

让我知道你是否想要这个详细说明的任何部分。

你需要这是一个单一的公式? 我有一个想法,但它需要一些(相对简单)的步骤。

既然你在A1中有一个长句,那么去Data – > Text to Columns,然后把这个句子送到一个由空格分隔的Row中。 然后,删除任何标点符号。 那么,做一个简单的Countif()

把信息放入A1,然后进入数据 – >文本到列,select“分隔”,点击下一步,然后select“空间”:

在这里输入图像说明

点击完成,它会把整个东西放在第1行,每个单元格中有一个单词。 现在只需find/replace“。” 和“,”什么也没有。

然后,Countif来救援!

在这里输入图像说明

如果这样做,我们可以自动进入VB,所以你不必手动查找/replace这个puncutation。 在我进入之前,这个方法是否工作?

将string的长度减去string的长度,用关键字replace为关键字,然后将结果除以关键字的长度:

 =(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)