2008-05-10 11:41 基于trie树的分词算法(转载)

#ifndef _TRIE_H_
#define _TRIE_H_

struct trie_node
{
int value;
int eof;/* the tag of end*/
struct trie_node *child,*sibling;
};
extern void init_index();
extern int create_index(FILE *findex);
extern void search_index(FILE *fin,FILE *fout);
extern void free_index();
#endif

#include <stdio.h>
#include <stdlib.h>
#include "trie.h"

#define ascii_char(ch) (ch<0x7f?1:0)
#define HASH_SIZE 65536
#define BUFFER_SIZE 256/*assume the max CJK word is 128*/

/*here I don't read the in file into memory then analyze it*/
/*because it   is hard to assure the size of in file*/
/*and the operate system like WIN32 have done the job of reading the file block*/
/*into memory and we just have few times to using fseek to back in the file*/

static struct trie_node hash[HASH_SIZE];

/*init the hash table*/
extern void init_index()
{
int i;
   struct trie_node *tmp;
for(i=0;i<HASH_SIZE;i++)
{
   tmp=hash+i;
   tmp->eof=0;
   tmp->value=0;
   tmp->child=NULL;
   tmp->sibling=NULL;
}
}

/*malloc a new node for stroe a CJK*/
/*be sure the eof=0,stand for non stop here*/
static struct trie_node * new_trie_node(int value)
{
     struct trie_node *tmp;
     tmp=(struct trie_node*)malloc(sizeof(struct trie_node));
     tmp->value=value;
     tmp->eof=0;
     tmp->child=NULL;
     tmp->sibling=NULL;

return tmp;
}

/*create the index*/
/*read the file*/
extern int create_index(FILE *findex)
{
int value;
unsigned char ch;
struct trie_node *head,*tmp;

while((ch=fgetc(findex))!=0xff)/*at the eof*/
{
   if(ascii_char(ch))
    return 0;
   value=ch;
   ch=fgetc(findex);
   value=(value<<8)+ch;
   head=hash+value;/*locate the hash position first*/
   /*head ,right*/
  
   while((ch=fgetc(findex))!='\n')/*if char='\n',stanf for a new word*/
    /*if that occurs,sorry,we have to create once again*/
   {
    if(ascii_char(ch))
     return 0;
    value=ch;
    ch=fgetc(findex);
    value=(value<<8)+ch;
    
    /*here exits three condition*/
    /*head->child=NULL,so we have to create a new node*/
    /*head->child->value=value*/
    /*head->child->value!=value,so we have to find in the sibling*/
    if(head->child==NULL)
    {
     head->child=new_trie_node(value);
     head=head->child;
    }
    else if(head->child->value==value)/*if exist*/
     head=head->child;/*go as the child goes*/
    else
    {
     head=head->child;
     tmp=head->sibling;
     while(tmp)
     {
      if(tmp->value==value)
       break;
      head=tmp;
      tmp=tmp->sibling;
     }
     if(tmp)/*if exist*/
      head=tmp;/*save the head*/
     else
     {
      head->sibling=new_trie_node(value);
      head=head->sibling;
     }
    }
   }
   head->eof=1;/*when a word insert into it*/
   /*we have to update the tag of eof*/
}
return 1;/*insert succefully*/
}

static void free_trie(struct trie_node *head)
{
struct trie_node *p1,*p2;
if(head==NULL)
   return ;
else
{
   p1=head->child;
   if(!p1)
    return ;
   else
   {
    while(p1)
    {
     p2=p1->sibling;
     free_trie(p1);
     p1=p2;
    }
   }
   free(head);
}
return ;
}

extern void free_index()
{
int i;
struct trie_node *head,*p1,*p2;
for(i=0;i<HASH_SIZE;i++)
{
   head=hash+i;
   p1=head->child;
   if(!p1)
    continue;
   else
   {
    while(p1)
    {
     p2=p1->sibling;
     free_trie(p1);
     p1=p2;
    }
   }
}
return ;
}

static void output_buffer(FILE *fin,FILE *fout,unsigned char *buffer,\
     int last_match_offset,int cur_file_offset)
{
/*here we have to putput the buffer*/
/*and reseek the infile*/
int i;
for(i=0;i<last_match_offset;i++)
   fputc(*(buffer+i),fout);
fputc('\n',fout);
fseek(fin,last_match_offset-cur_file_offset,SEEK_CUR);
/*the file pos has to back a distance*/

return ;
}
extern void search_index(FILE *fin,FILE *fout)
{
/*last_match_offset:the last offset come across the tag of eof*/
/*cur_buffer_offset:record the pos of buffer*/
/*cur_file_offset:record the pos of file,because we have to back in the file*/
int last_match_offset,\
   cur_buffer_offset,\
   cur_file_offset;
   /*sometimes*/
unsigned char ch[2];
int value;
unsigned char buffer[BUFFER_SIZE]={0};
struct trie_node *head;

while((ch[0]=fgetc(fin))!=0xff)
{
   last_match_offset=0;
   cur_buffer_offset=0;
   cur_file_offset=0;
   head=NULL;
  
   if(ascii_char(ch[0]))
   {
    output_buffer(fin,fout,buffer,\
      last_match_offset,cur_file_offset);
    fputc(ch[0],fout);
    fputc('\n',fout);
    continue;
   }
  
   buffer[cur_buffer_offset++]=ch[0];
   value=ch[0];
  
   ch[1]=fgetc(fin);
   buffer[cur_buffer_offset++]=ch[1];
   value=(value<<8)+ch[1];
  
   last_match_offset+=2;/*fetch two char*/
   cur_file_offset+=2;/*fetch two char*/
  
   head=hash+value;
   while((ch[0]=fgetc(fin))!=0xff)
   {
    if(ascii_char(ch[0]))
    {
     output_buffer(fin,fout,buffer,\
       last_match_offset,cur_file_offset);
     fputc(ch[0],fout);
     fputc('\n',fout);
     break;
    }
   
    ch[1]=fgetc(fin);
    value=(ch[0]<<8)+ch[1];
   
    cur_file_offset+=2;
    if(head->child==NULL)/*of course this is not match*/
    {
     output_buffer(fin,fout,buffer,\
      last_match_offset,cur_file_offset);
     break;/*match noce again*/
    }
    head=head->child;
    while(head)
    {
     if(head->value==value)/*match*/
     {
      buffer[cur_buffer_offset++]=ch[0];
      buffer[cur_buffer_offset++]=ch[1];
      if(head->eof)/*max length,has to update the*/
       /*last_match_offset*/
       last_match_offset=cur_buffer_offset;
      break;
     }
     head=head->sibling;
    }
    if(!head)/*if not match,match once again as one word*/
    {
     output_buffer(fin,fout,buffer,\
      last_match_offset,cur_file_offset);
     break;
    }
   }
}
return ;
}

#include <stdio.h>
#include <stdlib.h>
#include "trie.h"

int main()
{
FILE *findex,*fin,*fout;

findex=fopen("vocabulary.txt","r");

/*in
it the index first*/
/*the file format should be like this*/
/* ********* ('\n') */
/* ********* ('\n') */
/* ................ */
/*   ********* ('\n') */
/*be sure at the end of file,there should be a crlf*/

init_index();
if((findex==NULL)||(create_index(findex)==0))
{
   printf("insert index error\n");
   getchar();
   exit(1);
}
fclose(findex);
printf("OK\n");

fin=fopen("in.txt","r");
fout=fopen("out.txt","w+");

基于trie树的分词算法
if(fin==NULL)
{
   printf("search index error\n");
   getchar();
   exit(1);
}
search_index(fin,fout);
printf("OK\n");
free_index();

fclose(fin);
fclose(fout);

getchar();
return 0;
}
【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
1、资源项目源码均已通过严格测试验证,保证能够正常运行;、 2项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值