PFR人民日报标注语料库(版本1.0,下面简称PFR语料库)是在得到人民日报社新闻信息中心许可的条件下,以1998年人民日报语料为对象,由北京大学计算语言学研究所和富士通研究开发中心有限公司共同制作的标注语料库。该语料库对600多万字节的中文文章进行了分词及词性标注,其被作为原始数据应用于大量的研究和论文中。由于该语料库是以文本形式提供的,本文给出了读取该语料库的C#代码,供网友参考。
人民日报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包下载
https://files.cnblogs.com/eaglet/199801.part01.rar
https://files.cnblogs.com/eaglet/199801.part02.rar
https://files.cnblogs.com/eaglet/199801.part03.rar
https://files.cnblogs.com/eaglet/199801.part04.rar
https://files.cnblogs.com/eaglet/199801.part05.rar
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述