2016/3/10 晚上开始
首先要实现的功能:对英文文档中的单词进行统计,计算词频;
构造了一个Token类,
//Token
private:
char *token; //存储每个单词
int count; //存储单词出现的次数
public:
Token *next; //构造Token链表,指向下一个Token对象
Token(char *t) //构造函数给Token对象附初值;
{
strcpy(token, t);
count = 1;
next = NULL;
}
void addcount()
{
count += 1;
}
bool equname(char *t) //判断是否属于同一个单词
{
if (strlen(t) != strlen(token))
return 0;
for (int i = 0;i < strlen(t);i++)
{
if (t[i] != token[i])
{
return 0;
break;
}
}
return 1;
}
int get_count() //返回单词数;
{
return count;
}
void print_t() //打印token对象;
{
std::printf("the token:");
std::cout << token;
std::cout << "\t\t";
std::cout << "the count:";
std::cout << count << std::endl;
}
};
根据Token类构造链表,对输入的字符串进行分割,每个单词作为一个Token对象存储,计算词频;
从第一个句子开始,将head指针指向第一个单词的Token对象,此后head指针保持不变,随后每次分割出一个单词都要从链表头开始进行检测,如果有相同的单词存在,则单词数加一,如果不存在,则构造新的Token对象存储。对于这种检测方法,如果文档长且重复词少,则越到后面所需时间越长,以后可以用新的算法代替。
void Analy(char * s1) //对输入的字符串进行分割,每个单词作为一个Token对象存储,计算词频;
{
char* c = strtok(s1, d);
while (c)
{
Token *temp = new Token(c); //Token temp(c);
if (head == NULL)
{
head = temp;
curr = temp;
}
else
{
if (!search(head, c)) //search函数检查单词c是否已存在链表中;
{
curr->next = temp;
curr = temp;
}
}
c = strtok(NULL, d);
}
}
打下划线的那一行代码,一开始犯了个小错误,直接声明了temp的Token对象,然后head和curr指针是对temp的引用(head=&temp,curr=&temp),这样head和curr直接指向了temp的地址空间,curr发生了移动,head也跟着动;
Token *temp = new Token(c); 这种方式则是生成一个Token对象再将地址存在temp中,指针之间可以赋值,对象和指针之间只能引用。
内存图如下:
到目前为止,一切都是很顺利的,之前的函数都是直接定义一个字符数组进行测试的,结果符合预想,接下来是将直接定义的字符数组换成从一个文档中读取一行数据进行分析,但是此处有bug,对于多行文档,结果总是出错,最后一行的数据会覆盖前面几行的单词,但是单词的数目是正确的,今天的工作到此为止,总结一下今天所学:
1.类对象和类指针的使用,也就是上面所提到的是直接生成类对象,还是用指针来使用类对象,这个要视情况而定,两个都有固定的存储空间;
2.strlen()函数返回数组中元素个数;
Sizeof()函数返回字符数组中所有元素所占的总字节数;
Sizeof(string)返回的是一个string对象所占的字节数,是一个固定值;
3.字符串切割函数
char *c=strtok(s,d)
C=strtok(null,d);
2016/3/12
用了一天调试程序,终于解决了bug;
问题主要是token的存储方式不对,
private:
char *token; //存储每个单词 改为char token[20];
int count; //存储单词出现的次数
在循环中定义一个字符数组s[80]存储每次从文档中getline的一行数据,再将这一行数据以指针形式传给Anlay函数处理,Token对象中的token指针指向切割后的字符串;每次循环s[]数组都会被重新生成和回收,所以token指针指向的数据区就发生了变化,因此作为存储还是要有自己的空间才好。
分享到:
相关推荐
在本项目中,我们关注的是一个使用C++编程语言实现的英文词频分析器。这个程序的核心功能是对输入的文本进行处理,统计其中每个单词出现的频率,为文本挖掘和自然语言处理提供基础数据。其独特之处在于它利用了...
"基于词表的词频统计" 本文主要讲解了基于词表的词频统计技术,该技术是中文信息处理的一项基本技术,...本文提供了一个基于词表的词频统计的代码实现,使用了 C++ 语言和哈希表、链表和快速排序等数据结构和算法。
在本项目"**C++词频分析/词频分析器**"中,开发者使用C++编程语言构建了一个工具,该工具能够读取文本输入,并统计其中每个单词出现的频率,这对于诸如信息检索、自然语言处理、文本挖掘等多个应用场景具有重要意义...
【标题】:“英文文章词频统计”涉及到的主要技术点包括英文文本处理、词频分析以及在Visual Studio 2012环境下的C++编程实践。 【描述】:这个任务是基于一个华为面试题设计的,目标是开发一个程序,能够读取ASCII...
在本项目中,我们主要探讨的是如何使用C++编程语言实现一个简单的文档中英文词频统计器。这个程序的核心在于处理文本数据,并通过链表这一数据结构来存储和操作单词及其出现频率。以下是对相关知识点的详细说明: 1...
综上所述,MFC的英文词频统计项目涵盖了C++编程、MFC框架的使用、文件操作、字符串处理、算法设计等多个方面的知识点,是一个综合性的编程练习。通过这样的项目,开发者不仅可以提升MFC应用开发的能力,也能加深对...
基于Qt框架的Pyside2,使用Python语言进行开发了一个英语词频统计软件。完成了对英语本文的词频统计功能,可直接对一段文本进行粘贴统计,也可以对指定文件夹下(包括其下的子目录)的所有txt文件进行分析,界面可...
在本项目实践中,我们聚焦于“人工智能”领域中的一个核心应用——信息检索,具体实现了一个基于不同策略的英文单词词频统计与检索系统。这个系统旨在高效地处理文本数据,通过对英文单词进行词频统计,进而支持快速...
一篇英文文章存储在一个文本文件中,然后分别基于线性表、二叉排序树和哈希表不同的存储结构,完成单词词频的统计和单词的检索功能。同时计算不同检索策略下的平均查找长度ASL,通过比较ASL的大小,对不同检索策略的...
英语单词词频统计 g++ -o statistics statistics.cpp ./statistics file1.txt file2.txt > result.txt
在本项目中,我们主要探讨的是如何使用C++编程语言实现英文文本的单词词频统计。这个任务的核心是处理文本数据,提取其中的单词,并计算它们出现的频率。以下是实现这个功能的一些关键知识点: 1. **C++基础**:C++...
在C语言中,我们可以编写程序来统计英文文本中的单词频率。以下是一个实现此功能的基本步骤: 1. **读取文本内容**:首先,程序需要打开文本文件并将其内容读入内存。在这个例子中,使用`fopen()`函数打开文件,`...
C#开发的英文试卷词频统计和渲染桌面程序 可以帮助统计英文试卷的各单词出现频率生成词库 之后根据词库渲染新试卷 本程序使用免费版本的Spire.pdf Spire.xls Spire.doc组件.zip
标题 "统计单词在文章中出现频率" 描述的是一个C++编程任务,目的是设计并实现一个程序,能够读取一个包含英文文章的文本文件,分析其中的单词,并统计每个单词出现的次数。最终,程序会将这些信息写入另一个文件,...
本知识点介绍了一个使用 C++ 编程语言编写的程序,旨在统计给定英文文本文件中某个英文单词的出现次数及其出现的位置。下面是对该程序的详细解释: 程序结构 该程序主要由四个部分组成: 1. 头文件包含与宏定义:...
- **构建词频矩阵**: 统计每个文档中每个词的出现次数,形成词频矩阵。 - **计算IDF**: 根据整个文档集计算每个词的IDF值。 - **计算TF-IDF**: 将词频乘以IDF得到TF-IDF值。 - **计算相似度**: 使用余弦相似度或其他...
此词频分析器可以实现英文的词频的统计,用c++语言实现
综上所述,使用字典树处理大型英文文件,可以高效地进行单词查找、统计和分析,对于文本挖掘、搜索引擎、拼写检查等领域具有重要意义。在实际项目中,根据需求,可以结合其他数据结构和算法来进一步优化和扩展字典树...
1.设计一个词频统计软件,统计给定英文文章的单词频率。 2.文章中包含的标点不计入统计。 3.将统计结果以从大到小的排序方式输出。 设计: 1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,...