人民日报1998年中文标注语料库及读取代码

人民日报 1998 年中文标注语料库及读取代码
代码作者:肖波
语料库:北京大学计算语言学研究所和富士通研究开发中心有限公司
PFR人民日报标注语料库(版本1.0,下面简称PFR语料库)是在得到人民日报社新闻信息中心许可的条件下,以1998年人民日报语料为对象,由北京大学计算语言学研究所和富士通研究开发中心有限公司共同制作的标注语料库。该语料库对600多万字节的中文文章进行了分词及词性标注,其被作为原始数据应用于大量的研究和论文中。
由于该语料库是以文本形式提供的,本文给出了读取该语料库的C#代码,供网友参考,代码中用到了一些公共的类,如CRegx,CFile等位于KTDictSeg组件中,可以到我的另一篇文章《KTDictSeg 一种简单快速准确的中文分词方法 》中下载。

 

调用示例


 using  System;
 using  System.Collections;
 using  System.Collections.Generic;
 using  System.Text;
 using  KTDictSeg;
 using  General;
 
 namespace  MachineLeaning
   {
      class  T_Word
        {
          public  String Word;  // 单词
          public  int  POS;   // 词性
          public  long  Freq;    // 词频  
     } ;
 
       /**/ ///  <summary>
      ///  1998年人民日报标注预料库的提取
      ///  </summary>
      class  People1998
        {
           Private Members #region  Private Members
          static  Hashtable m_WordTbl  =  new  Hashtable();  // 单词表
 
           /**/ ///  <summary>
          ///  将字符串类型的词性转换为位域型的词性变量
          ///  </summary>
          ///  <param name="strPOS"> 字符串类型的词性标注 </param>
          ///  <returns> 位域型词性标注 </returns>
          static  private  T_POS GetPosFromString(String strPOS)
            {
             strPOS  =  strPOS.Trim().ToLower();
 
              switch (strPOS)
                {
                  case  " ag " :
                  case  " ad " :
                  case  " an " :
                  case  " a " :     //     形容词 形语素
                      return  T_POS.POS_D_A;
 
                  case  " bg " :
                  case  " b " :     //     区别词 区别语素
                      return  T_POS.POS_D_B;
 
                  case  " c " :     //     连词 连语素
                      return  T_POS.POS_D_C;
 
                  case  " dg " :
                  case  " d " :     //     副词 副语素
                      return  T_POS.POS_D_D;
 
                  case  " e " :     //     叹词 叹语素
                      return  T_POS.POS_D_E;
 
                  case  " f " :     //     方位词 方位语素
                      return  T_POS.POS_D_F;
 
                  case  " i " :     //     成语
                      return  T_POS.POS_D_I;
 
                  case  " j " :
                  case  " l " :     //     习语
                      return  T_POS.POS_D_L;
 
                  case  " mg " :
                  case  " m " :     //     数词 数语素
                      return  T_POS.POS_A_M;
 
                  case  " mq " :    //     数量词
                      return  T_POS.POS_D_MQ;
 
                  case  " na " :
                  case  " ng " :
                  case  " n " :     //     名词 名语素
                      return  T_POS.POS_D_N;
 
                  case  " o " :     //     拟声词
                      return  T_POS.POS_D_O;
 
                  case  " p " :     //     介词
                      return  T_POS.POS_D_P;
 
                  case  " q " :     //     量词 量语素
                      return  T_POS.POS_A_Q;
 
                  case  " rg " :
                  case  " r " :     //     代词 代语素
                      return  T_POS.POS_D_R;
 
                  case  " s " :     //     处所词
                      return  T_POS.POS_D_S;
 
                  case  " tg " :
                  case  " t " :     //     时间词
                      return  T_POS.POS_D_T;
 
                  case  " u " :     //     助词 助语素
                      return  T_POS.POS_D_U;
 
                  case  " vg " :
                  case  " vn " :
                  case  " vd " :
                  case  " vv " :
                  case  " v " :     //     动词 动语素
                      return  T_POS.POS_D_V;
 
                  case  " w " :     //     标点符号
                      return  T_POS.POS_D_W;
 
                  case  " x " :     //     非语素字
                      return  T_POS.POS_D_X;
 
                  case  " yg " :
                  case  " y " :     //     语气词 语气语素
                      return  T_POS.POS_D_Y;
 
                  case  " z " :     //     状态词
                      return  T_POS.POS_D_Z;
 
                  case  " nr " : //     人名
                      return  T_POS.POS_A_NR;
 
                  case  " ns " : //     地名
                      return  T_POS.POS_A_NS;
 
                  case  " nt " : //     机构团体
                      return  T_POS.POS_A_NT;
 
                  case  " nx " : //     外文字符
                      return  T_POS.POS_A_NX;
 
                  case  " nz " : //     其他专名
                      return  T_POS.POS_A_NZ;
 
                  case  " h " :     //     前接成分
                      return  T_POS.POS_D_H;
 
                  case  " k " :     //     后接成分
                      return  T_POS.POS_D_K;
 
                  case  " un " : //   未知词性
                      return  T_POS.POS_UNK;
 
                  default :
                      return  T_POS.POS_UNK;
                     
             }
 
         }
 
           /**/ ///  <summary>
          ///  将一个单词插入单词表
          ///  </summary>
          ///  <param name="word"> 单词 </param>
          ///  <param name="strPOS"> 词性 </param>
          static  private  void  InsertOneWordToTbl(String word, String strPOS)
            {
              if  (word  ==  null  ||  strPOS  ==  null )
                {
                  return ;
             }
 
             word  =  word.Trim();
              if  (word  ==  "" )
                {
                  return ;
             }
 
             T_POS tPOS  =  GetPosFromString(strPOS);
 
             T_Word tWord  =  (T_Word)m_WordTbl[word];
 
              if  (tWord  ==  null )
                {
                 tWord  =  new  T_Word();
                 tWord.Freq  =  0 ;
                 tWord.POS  =  0 ;
                 tWord.Word  =  word;
                 m_WordTbl[word]  =  tWord;
             }
 
             tWord.Freq ++ ;
             tWord.POS  |=  ( int )tPOS;
         }
 
 
           /**/ ///  <summary>
          ///  删除文本中每句前面的时间
          ///  </summary>
          ///  <param name="text"></param>
          ///  <returns></returns>
          static  private  String DeleteDate(String text)
            {
              return  CRegex.Replace(text,  @" 1998/d+-/d+-/d+-/d+///w " ,  "" ,  true );
         }
 
           /**/ ///  <summary>
          ///  从文件载入到字符串中
          ///  </summary>
          ///  <param name="fileName"></param>
          ///  <returns></returns>
          static  private  String LoadFromFile(String fileName)
            {
              return  CFile.ReadFileToString(fileName,  " GB2312 " );
         }
 
           /**/ ///  <summary>
          ///  从字符串读入到单词表中
          ///  </summary>
          ///  <param name="text"></param>
          static  private  void  ReadWordFromString(String text)
            {
             ArrayList strs  =  new  ArrayList();
             CRegex.GetMatchStrings(text,  @" (/w+)/s*///s*([a-zA-Z]{1,2}) " ,  true ,  ref  strs);
 
             String word  =  "" ;
 
              for  ( int  i  =  0 ; i  <  strs.Count; i ++ )
                {
                  if  (i  %  2  ==  0 )
                    {
                     word  =  (String)strs[i];
                 }
                  else
                    {
                     InsertOneWordToTbl(word, (String)strs[i]);
                 }
             }
         }
 
          #endregion
 
           Public Members #region  Public Members
 
           /**/ ///  <summary>
          ///  将预料库中的单词和词性标注载入到单词表中
          ///  </summary>
          ///  <param name="fileName"> 人民日报1998年标注预料库文件 </param>
          static  public  void  Load(String fileName)
            {
             String text  =  LoadFromFile(fileName);
 
             text  =  DeleteDate(text);
 
             ReadWordFromString(text);
         }
 
           /**/ ///  <summary>
          ///  获取某个单词的属性
          ///  </summary>
          ///  <param name="word"> 单词 </param>
          ///  <returns></returns>
          static  public  T_Word GetWordAttribute(String word)
            {
              return  (T_Word)m_WordTbl[word];
         }
 
           /**/ ///  <summary>
          ///  获取所有单词列表
          ///  </summary>
          ///  <returns> 单词列表 </returns>
          static  public  List < T_Word >  GetWordList()
            {
             List < T_Word >  retWords  =  new  List < T_Word > ();
 
              foreach (String word  in  m_WordTbl.Keys)
                {
                 retWords.Add((T_Word)m_WordTbl[word]);
             }
 
              return  retWords;
         }
 
 
          #endregion
 
 
     }
 }
               if  (openFileDialogDict.ShowDialog()  ==  DialogResult.OK)
                {
                  try
                    {
                     People1998.Load(openFileDialogDict.FileName);
                 }
                  catch (Exception e1)
                    {
                     CMsgBox.ShowErrorMessageBox(e1.Message);
                 }
             }

语料库下载地址
由于较大,分成5包下载

http://www.cnblogs.com/Files/eaglet/199801.part01.rar
http://www.cnblogs.com/Files/eaglet/199801.part02.rar
http://www.cnblogs.com/Files/eaglet/199801.part03.rar
http://www.cnblogs.com/Files/eaglet/199801.part04.rar
http://www.cnblogs.com/Files/eaglet/199801.part05.rar


本文来自CSDN博客,转自:http://blog.csdn.net/eaglet/archive/2007/09/10/1778995.aspx

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BERT模型对语料库预处理的代码主要包括以下几个步骤: 1. 将原始语料库转化为BERT模型能够处理的格式 2. 对输入文本进行分词 3. 添加特殊标记,如[CLS]、[SEP]等 4. 对句子进行padding,使其长度相同 5. 构建输入的特征向量 下面是一个简单的BERT模型对语料库预处理的代码示例: ```python import torch from transformers import BertTokenizer from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSampler # 加载BERT分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # 加载数据集 sentences = ["This is the first sentence.", "This is the second sentence."] labels = [0, 1] # 对文本进行分词和添加特殊标记 input_ids = [] for sentence in sentences: encoded_sent = tokenizer.encode(sentence, add_special_tokens=True) input_ids.append(encoded_sent) # 对句子进行padding MAX_LEN = 64 input_ids = torch.tensor([i + [0]*(MAX_LEN-len(i)) for i in input_ids]) # 构建attention masks attention_masks = [] for sent in input_ids: att_mask = [int(token_id > 0) for token_id in sent] attention_masks.append(att_mask) # 构建数据集 dataset = TensorDataset(input_ids, attention_masks, torch.tensor(labels)) # 构建数据加载器 batch_size = 32 dataloader = DataLoader(dataset, sampler=RandomSampler(dataset), batch_size=batch_size) ``` 以上代码中,我们首先加载了BERT分词器,然后对输入文本进行分词和特殊标记的添加,接着对句子进行padding,最后构建了输入特征向量和数据加载器。这样,我们就可以将预处理后的数据输入到BERT模型中进行训练或推理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值