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