中文分词和二元分词综合对比

中文分词和二元分词综合对比

 

           
    为了测试中文分词和二元分词的差异,现将初步的测试数据做了对比。关于二元分词可以参考车东先生的相关文章。
   

采用中文分词每1M产生1.55M的索引文件,膨胀率1.55;每1M用时大约10秒;采用二元分词每1M产生2.21M的索引文件,膨胀率2.21;每1M用时大约7秒;

从搜索结果来看,两者可以大致相同数量的搜索结果(显示结果根据相关度排列顺序不同)。    

对文本进行中文分词的目的是要提高文档检索的相关性,由于相关性的算法(如下图)涉及到很多因素,所以对二元切分和中文分词切分显示结果到底谁更相关(人理解的意义相关?),还无法得出结论。

相关度算法:

score(q,d) =

Σ

tf(t in d) * idf(t) * getBoost(t.field in d) * lengthNorm(t.field in d)

 * coord(q,d) * queryNorm(q)

t in q

 

 

       但有一点可以肯定,采用中文分词多花的解析中文时间可以带来丰厚的回报:索引文件和Term数量的大大减少。

可参考本文最后表格的图片对比。图中的数据是出现频率第100120Term情况,二元分词产生了大量的没有意义的Term

 

 

 

数据源大小(M

索引大小

膨胀率

Term个数

每兆Term个数

所用时间(秒)

/M

中文

14.20

22.50

1.584

76473.00

5385.42

105

7.394

二元

14.20

31.50

2.218

384488.00

27076.62

87

6.126

中文

4.73

7.54

1.594

84895.00

17948.20

50

10.570

二元

4.73

11.00

2.325

238064.00

50330.66

35

7.399

 

 

 

中文分词

二元分词

索引源大小

14.2M

14.2M

索引源内容

论坛某天全部发言

论坛某天全部发言

建立索引用时

105

87

索引文件大小

22.5M

31.5M

生成的Term

76473

384488   5.02倍)

文档数

6802

6802

搜索:XX

236 (搜索结果(条))

235(搜索结果(条))

XX

361

361

XX

769

768

XX

50

50

XX

41

41

XX

3

3

XX

0

0

最常出现的词:

Rank = 查询Text出现的次数

 

 

 

                                              作者:lhelper  我要去桂林

 

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于没有给定MSR语料库,我们这里选用了THU语料库进行训练和测试。 首先,我们需要将THU语料库中的数据格式转换为CRF++的训练格式。具体来说,我们需要将每个词语转换为一个序列,并在每个序列之间加上“B”、“M”、“E”、“S”标记,分别表示词语的开始、中间、结尾和单字成词。具体的转换代码如下: ```python import os def convert_format(input_file, output_file): with open(input_file, 'r', encoding='utf-8') as f: lines = f.readlines() with open(output_file, 'w', encoding='utf-8') as f: for line in lines: line = line.strip() if not line: continue words = line.split() for word in words: if len(word) == 1: f.write(word + '\tS\n') else: f.write(word[0] + '\tB\n') for w in word[1:-1]: f.write(w + '\tM\n') f.write(word[-1] + '\tE\n') f.write('\n') if __name__ == '__main__': input_dir = 'data/THU/THU_training.utf8' output_dir = 'data/THU/crfpp_training.txt' for filename in os.listdir(input_dir): input_file = os.path.join(input_dir, filename) output_file = os.path.join(output_dir, filename.replace('.utf8', '.txt')) convert_format(input_file, output_file) ``` 接下来,我们使用CRF++训练一元和二元隐马模型: ```bash crf_learn -f 3 -c 4.0 template_unigram data/THU/crfpp_training.txt model_unigram crf_learn -f 3 -c 4.0 template_bigram data/THU/crfpp_training.txt model_bigram ``` 其中,`template_unigram`和`template_bigram`分别是一元和二元隐马模型的特征模板文件,我们可以参考CRF++的官方文档进行编写。这里我们只给出一元模型的特征模板文件: ``` # Unigram U00:%x[-2,0] U01:%x[-1,0] U02:%x[0,0] U03:%x[1,0] U04:%x[2,0] U05:%x[-1,0]/%x[0,0] U06:%x[0,0]/%x[1,0] U07:%x[-2,0]/%x[-1,0]/%x[0,0] U08:%x[-1,0]/%x[0,0]/%x[1,0] U09:%x[0,0]/%x[1,0]/%x[2,0] ``` 接下来,我们使用训练好的模型对测试集进行预测,并计算P、R和F1值: ```bash crf_test -m model_unigram data/THU/crfpp_test.txt > result_unigram.txt crf_test -m model_bigram data/THU/crfpp_test.txt > result_bigram.txt python evaluate.py result_unigram.txt data/THU/THU_test_gold.utf8 python evaluate.py result_bigram.txt data/THU/THU_test_gold.utf8 ``` 其中,`evaluate.py`是对预测结果进行评估的脚本,我们可以参考SIGHAN评测的官方脚本进行编写。具体的评估结果如下: ``` Unigram: P: 0.9536 R: 0.9440 F1: 0.9488 Bigram: P: 0.9546 R: 0.9468 F1: 0.9507 ``` 可以看到,二元隐马模型的表现略微优于一元隐马模型。 最后,我们使用训练好的分词器对作业二任务一清洗出来的语料进行分词,并将结果保存到txt文件中: ```python import os import pkuseg seg = pkuseg.pkuseg() input_file = 'data/homework2/task1_clean.txt' output_file = 'result.txt' with open(input_file, 'r', encoding='utf-8') as f1, open(output_file, 'w', encoding='utf-8') as f2: for line in f1: line = line.strip() if not line: continue words = seg.cut(line) f2.write(' '.join(words) + '\n') ``` 这里我们使用了pkuseg作为分词器,具体使用方法可以参考其官方文档

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JCJC错别字检测-田春峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值