C ++计数功能词出现

Posted

技术标签:

【中文标题】C ++计数功能词出现【英文标题】:C++ count functional words occurrence 【发布时间】:2016-07-19 17:48:48 【问题描述】:

我正在尝试计算文本文件中特定单词的出现次数,问题是当我的代码读取文件时 - 它使用空格分隔符读取它,但我想要计算的一些单词是“ 2字词”例如“out from”

除此之外,还有第二个问题,那就是“不是”和“不要”之类的词——即使我在地图中用反斜杠放置它们,我的代码似乎也忽略了这些词——我的猜测是由于某种原因,它在从文件中读取它的过程中被忽略了

我正在寻找的最终结果是我正在搜索的单词的频率。

std::list<std::string> Fwords = 
"a","abroad","as far as","ahead of";

        // Begin reading from file:
        std::ifstream fileStream(fileName);

        // Check if we've opened the file (as we should have).
        if (fileStream.is_open())
            while (fileStream.good())
            
                // Store the next word in the file in a local variable.
                std::string word;
                fileStream >> word;
                std::cout << "This is the word: " << word << endl;

                if (std::find(std::begin(Fwords), std::end(Fwords), word) != std::end(Fwords))
                    wordsCount[word]++;
            

输入:

 "ahead of me as far as abroad me"

这将是预期的输出:

abroad:1
ahead of:1
as far as:1

【问题讨论】:

所以你说“as far as”应该被视为一个词? 你能发一个minimal reproducible example吗?我们不需要查看您要计算的所有单词 @LogicStuff,他可以,这只是一个空操作。 如果您只想完成工作,请使用std::regex_search 您的条目真的是独一无二的吗?所以我的意思是,您是否分别检测到"out from""out""from"?可能@LogicStuff 的提议目前看来是最合适的。 【参考方案1】:

这种方法行不通。您的问题是您一次从 file 中读取一个单词。再多的反斜杠或操纵单词列表/地图都无法解决这个问题。

但是你怎么知道要读多少字呢?你不知道——这必须是反复试验。

考虑到您的编程水平,“蛮力”的一种方法是将else 案例添加到

if (std::find(std::begin(Fwords), std::end(Fwords), word) != std::end(Fwords))

    // ...

在其中检查地图中以文件中的单词开始的单词,例如“as”,但带有空格,因此搜索是as 。如果找到一个或多个匹配项,则该从文件中读取另一个单词,例如“as far”。这应该放在一个循环中(或在循环中调用的函数),以便自动搜索as far 并读取另一个单词“as”。成功找到as far as 后,您就完成了。如果找不到 as as far as far as,如果您的地图中没有这些,您也会完成,在这种情况下,您想要运行for 循环遍历每个单词以检查它们本身是否是单词,如果是则增加它们的计数。在此努力中,您将意识到您需要与原始代码相同的代码;所以把它也分解成一个函数是很聪明的。

【讨论】:

以上是关于C ++计数功能词出现的主要内容,如果未能解决你的问题,请参考以下文章

计数值在组 R 中出现的次数

collections

Python之collection

如何用C语言编写一个程序,输入10个0-9之间的整数,请统计每个数字出现的个数,并输出?

调用函数后检测到 C 堆栈粉碎

python之collection系列