计算单个单元格中特定单词的频率
Count the frequency of a specific word in a single cell
在 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
。
如何让函数只计算完全匹配?
我这里有一个解决方案,但不是很好。
正如我在评论中指出的那样,问题是 Excel 没有内部函数来查看单元格是否包含 'exact match'。您可以检查单元格中的总值是否完全匹配,但无法检查搜索词是否已像那样共轭。因此,我们需要创建一个特殊的方法来检查每个以 'acceptable' 结尾的单词。在我看来,这将是任何以 space 结尾的内容,任何以标点符号结尾的内容,以及单元格末尾没有任何内容的任何内容。
数组公式
您使用 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 的所有 'acceptable' 匹配项。正如我之前所说,我们可以将可接受的答案定义为以标点符号、space 或单元格结尾结尾的答案。单元末尾的东西是一种特殊情况,我们稍后会考虑。首先,看看下面的公式。在单元格 C1:C6 中,我手动输入了一个逗号、一个句号、一个分号;连字符、space 和斜线。这些将是结束 B1 中找到的单词的 'acceptable' 方式。
=LEN(SUBSTITUTE(A1,B1&C1:C6,""))
使用 CTRL + SHIFT + ENTER 确认,这采用 B1 中搜索词的替换长度 附加 C1:C6 中可接受的词尾。所以它给出了 6 个新的替换词的长度。但由于这是一个结果数组,我们需要将它们加在一起得到一个数字,如下所示:
=SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
公式化结果
要像在句子中那样使用它,我们现在需要从原始单词的长度中减去这个长度。请注意,简单地执行此操作存在一个问题 - 由于我们正在搜索多次,因此我们需要多次添加原始单词的长度。考虑这样的事情:
=LEN(A1)-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
这行不通,因为它只增加了一次A1的长度,却多次减去替换字符串的长度。这个怎么样?
=LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
这是可行的,因为我们用 C1:C6 搜索了 6 个词尾词,所以那里的替换将发生 6 次。所以我们有单词的原始长度 6 倍,每个替换单词的长度 6 倍[请记住,如果没有匹配项,比如 "potato;",那么该术语将给出原始单词,因此否定了我们按预期添加该单词长度的次数之一。
为了最终确定,我们需要除以搜索词中的字母数。请记住,在“/LEN(B1)”的位置,我们需要为每个词尾的长度添加一个字符。
=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1)
最后,我们需要添加特殊情况,即 A1 的最后部分等于搜索词,没有词尾。单独,这将是:
=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。就是这样,它现在会为您提供所有 "exact matches" 搜索字词的计数。
数组公式的替代方法
请注意,除了使用 C1:C6,您还可以对公式进行硬编码,以查找特定的标点符号作为词尾。这将更难维护,但在我看来,同样可读。它看起来像这样:
=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&{",",".",";"," ","/","-"},""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0)
这在技术上仍然是一个 "array formula",它的工作原理与我上面描述的相同。但是,这里的一个好处是您只需使用 ENTER 即可确认此类条目。这很好,以防有人不小心编辑了您的单元格并在没有注意到的情况下按了 ENTER。否则,这等同于上面的格式。
如果您想详细说明其中的任何部分,请告诉我。
你需要这是一个单一的公式吗?我有一个想法,但它需要一些(相对简单的)步骤。
既然你在A1中有一个长句子,那么去Data -> Text to Columns,然后将这个句子发送到一个行中,用空格分隔。然后,删除所有标点符号。然后,做一个简单的 Countif()
?
将信息放入 A1,然后转到数据 --> 文本到列,选择 "Delimited",单击下一步,然后选择 "Space":
单击“完成”,它会将整个内容放入第 1 行,每个单元格中都有一个单词。现在只是 Find/Replace “.”和“,”什么都没有。
那么,Countif 来拯救!
如果可行,我们可以自动输入 VB,因此您不必手动 find/replace 标点符号。在我开始之前,这个方法行得通吗?
将字符串的长度减去关键字替换为空的字符串的长度,然后将结果除以关键字的长度:
=(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)
我确实有一个替代解决方案供您考虑。我多拿了一点space,公式稍微复杂了一点,但从某种意义上说会更简单。
使用 C 列作为新的辅助列。 C 列将从 A 列中提取文本,并将所有标点符号替换为“”。完成此操作后,计算 B 列中搜索词实例的公式将是一个简单的公式,基本上与您在 OP 中的公式相同。
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," ")
此公式首先用所有斜线替换 spaces,然后用该替换文本用破折号替换 spaces,然后用该替换文本用 spaces 替换分号等。如您所述,如果您使用分号作为分隔符,则需要将我的逗号分隔词替换为分号。
那么 D1 中的公式就是您上面的 OP 中的公式,有两个变化:我们将搜索 B1 和“”,因为我们知道所有 'exact matches' 现在以 spaces,如果 C1 中文本的最后部分与 B1 中的搜索词相同,我们将添加一个额外的“1”——因为如果单元格以该词结尾,它不会有space,但它仍然是一个 'exact match'。像这样:
=(LEN(C1)-LEN(SUBSTITUTE(C1,B1&" ","")))/(LEN(B1)+1)+IF(RIGHT(C1,LEN(B1))=B1,1,0)
编辑
我的标点符号列表只是一个建议;我建议您仔细阅读一些示例文本,并确保单词后没有任何奇怪的字符。另外,考虑将我拥有的不常见的(如“/”或“-”)更改为“?”要么 ”!”。如果要添加更多,只需按照 SUBSTITUTE 公式的模式即可。
要使其不区分大小写,您只需更改 C 列中的公式,使结果全部小写,然后确保 B 列中的搜索字词为小写。像这样更改 C 列:
=LOWER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," "))
很抱歉让我做到了 "a new answer"。你可以把它移到任何地方。
我刚刚找到了 Liu Kang 于 2015 年 8 月 3 日在 12:15 提出的答案的解决方案。 :)
不幸的是,我没有“50 声望”来评论 Grade 'Eh' Bacon 上面的解决方案,最后一条评论是这样的:
Discovered a slight problem. Using =IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;B1&" ";"")))/(LEN(B1)+1)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")
with shoe in B1 gives the following result: shoe in A1 = 1 (correct), shoes in A1 = 0 (correct), ladyshoe in A1 = 1 (wrong). Guess this have to do with "RIGHT" in the formula. Is it possible to make the formula non-matching for prefix words? E.g if B1 is containing shoe and A1 is containing ladyshoe dogshoe catshoes shoes I want C1 to result in 0. – Liu Kang Aug 3 '15 at 12:15
解决方法是在单词的开头也搜索space (" "&B1&" ") 并添加 "one"更多 LEN(B1)+2。所以,它变成了 =IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;" "&B1&" ";"")))/(LEN(B1)+2)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")
.
如果我们要查找的单词在开头,则还有一个问题。因为句首明显没有space" "
。我使用了一个解决方法 - 我在 A1 中有我的句子,但是我有一个隐藏的列 B,其中 B1 中有 =" "&A1
并将我需要的 "space" 放在句子的开头和原始等级 'Eh' Bacon 解决方案中的所有内容都已移动(A1->B1,B1->C1,C1->D1)。
希望对您有所帮助,感谢所有参与此话题的人,你们帮了我大忙!
在 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
。
如何让函数只计算完全匹配?
我这里有一个解决方案,但不是很好。
正如我在评论中指出的那样,问题是 Excel 没有内部函数来查看单元格是否包含 'exact match'。您可以检查单元格中的总值是否完全匹配,但无法检查搜索词是否已像那样共轭。因此,我们需要创建一个特殊的方法来检查每个以 'acceptable' 结尾的单词。在我看来,这将是任何以 space 结尾的内容,任何以标点符号结尾的内容,以及单元格末尾没有任何内容的任何内容。
数组公式
您使用 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 的所有 'acceptable' 匹配项。正如我之前所说,我们可以将可接受的答案定义为以标点符号、space 或单元格结尾结尾的答案。单元末尾的东西是一种特殊情况,我们稍后会考虑。首先,看看下面的公式。在单元格 C1:C6 中,我手动输入了一个逗号、一个句号、一个分号;连字符、space 和斜线。这些将是结束 B1 中找到的单词的 'acceptable' 方式。
=LEN(SUBSTITUTE(A1,B1&C1:C6,""))
使用 CTRL + SHIFT + ENTER 确认,这采用 B1 中搜索词的替换长度 附加 C1:C6 中可接受的词尾。所以它给出了 6 个新的替换词的长度。但由于这是一个结果数组,我们需要将它们加在一起得到一个数字,如下所示:
=SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
公式化结果
要像在句子中那样使用它,我们现在需要从原始单词的长度中减去这个长度。请注意,简单地执行此操作存在一个问题 - 由于我们正在搜索多次,因此我们需要多次添加原始单词的长度。考虑这样的事情:
=LEN(A1)-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
这行不通,因为它只增加了一次A1的长度,却多次减去替换字符串的长度。这个怎么样?
=LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,"")))
这是可行的,因为我们用 C1:C6 搜索了 6 个词尾词,所以那里的替换将发生 6 次。所以我们有单词的原始长度 6 倍,每个替换单词的长度 6 倍[请记住,如果没有匹配项,比如 "potato;",那么该术语将给出原始单词,因此否定了我们按预期添加该单词长度的次数之一。
为了最终确定,我们需要除以搜索词中的字母数。请记住,在“/LEN(B1)”的位置,我们需要为每个词尾的长度添加一个字符。
=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&C1:C6,""))))/(LEN(B1)+1)
最后,我们需要添加特殊情况,即 A1 的最后部分等于搜索词,没有词尾。单独,这将是:
=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。就是这样,它现在会为您提供所有 "exact matches" 搜索字词的计数。
数组公式的替代方法
请注意,除了使用 C1:C6,您还可以对公式进行硬编码,以查找特定的标点符号作为词尾。这将更难维护,但在我看来,同样可读。它看起来像这样:
=(LEN(A1)*6-SUM(LEN(SUBSTITUTE(A1,B1&{",",".",";"," ","/","-"},""))))/(LEN(B1)+1)+IF(RIGHT(A1,LEN(B1))=B1,1,0)
这在技术上仍然是一个 "array formula",它的工作原理与我上面描述的相同。但是,这里的一个好处是您只需使用 ENTER 即可确认此类条目。这很好,以防有人不小心编辑了您的单元格并在没有注意到的情况下按了 ENTER。否则,这等同于上面的格式。
如果您想详细说明其中的任何部分,请告诉我。
你需要这是一个单一的公式吗?我有一个想法,但它需要一些(相对简单的)步骤。
既然你在A1中有一个长句子,那么去Data -> Text to Columns,然后将这个句子发送到一个行中,用空格分隔。然后,删除所有标点符号。然后,做一个简单的 Countif()
?
将信息放入 A1,然后转到数据 --> 文本到列,选择 "Delimited",单击下一步,然后选择 "Space":
单击“完成”,它会将整个内容放入第 1 行,每个单元格中都有一个单词。现在只是 Find/Replace “.”和“,”什么都没有。
那么,Countif 来拯救!
如果可行,我们可以自动输入 VB,因此您不必手动 find/replace 标点符号。在我开始之前,这个方法行得通吗?
将字符串的长度减去关键字替换为空的字符串的长度,然后将结果除以关键字的长度:
=(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1)
我确实有一个替代解决方案供您考虑。我多拿了一点space,公式稍微复杂了一点,但从某种意义上说会更简单。
使用 C 列作为新的辅助列。 C 列将从 A 列中提取文本,并将所有标点符号替换为“”。完成此操作后,计算 B 列中搜索词实例的公式将是一个简单的公式,基本上与您在 OP 中的公式相同。
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," ")
此公式首先用所有斜线替换 spaces,然后用该替换文本用破折号替换 spaces,然后用该替换文本用 spaces 替换分号等。如您所述,如果您使用分号作为分隔符,则需要将我的逗号分隔词替换为分号。
那么 D1 中的公式就是您上面的 OP 中的公式,有两个变化:我们将搜索 B1 和“”,因为我们知道所有 'exact matches' 现在以 spaces,如果 C1 中文本的最后部分与 B1 中的搜索词相同,我们将添加一个额外的“1”——因为如果单元格以该词结尾,它不会有space,但它仍然是一个 'exact match'。像这样:
=(LEN(C1)-LEN(SUBSTITUTE(C1,B1&" ","")))/(LEN(B1)+1)+IF(RIGHT(C1,LEN(B1))=B1,1,0)
编辑
我的标点符号列表只是一个建议;我建议您仔细阅读一些示例文本,并确保单词后没有任何奇怪的字符。另外,考虑将我拥有的不常见的(如“/”或“-”)更改为“?”要么 ”!”。如果要添加更多,只需按照 SUBSTITUTE 公式的模式即可。
要使其不区分大小写,您只需更改 C 列中的公式,使结果全部小写,然后确保 B 列中的搜索字词为小写。像这样更改 C 列:
=LOWER(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,","," "),"."," "),";"," "),"-"," "),"/"," "))
很抱歉让我做到了 "a new answer"。你可以把它移到任何地方。
我刚刚找到了 Liu Kang 于 2015 年 8 月 3 日在 12:15 提出的答案的解决方案。 :) 不幸的是,我没有“50 声望”来评论 Grade 'Eh' Bacon 上面的解决方案,最后一条评论是这样的:
Discovered a slight problem. Using
=IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;B1&" ";"")))/(LEN(B1)+1)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")
with shoe in B1 gives the following result: shoe in A1 = 1 (correct), shoes in A1 = 0 (correct), ladyshoe in A1 = 1 (wrong). Guess this have to do with "RIGHT" in the formula. Is it possible to make the formula non-matching for prefix words? E.g if B1 is containing shoe and A1 is containing ladyshoe dogshoe catshoes shoes I want C1 to result in 0. – Liu Kang Aug 3 '15 at 12:15
解决方法是在单词的开头也搜索space (" "&B1&" ") 并添加 "one"更多 LEN(B1)+2。所以,它变成了 =IF(B1<>"";(LEN(A1)-LEN(SUBSTITUTE(A1;" "&B1&" ";"")))/(LEN(B1)+2)+IF(RIGHT(A1;LEN(B1))=B1;1;0);"")
.
如果我们要查找的单词在开头,则还有一个问题。因为句首明显没有space" "
。我使用了一个解决方法 - 我在 A1 中有我的句子,但是我有一个隐藏的列 B,其中 B1 中有 =" "&A1
并将我需要的 "space" 放在句子的开头和原始等级 'Eh' Bacon 解决方案中的所有内容都已移动(A1->B1,B1->C1,C1->D1)。
希望对您有所帮助,感谢所有参与此话题的人,你们帮了我大忙!