CRF++中文分词
来源:互联网 发布:透明计算造假 知乎 编辑:程序博客网 时间:2024/06/05 15:56
本文实现python的CRF++中文分词
预备工作 当然是下载CRF++
CRF++
Linux版本的安装方法是:
i. 解压到某目录下
ii. 打开控制台,将当前目录切换到解压目录
iii. 依次输入命令:
./configure
make
su
make install
注:需要root权限才能成功安装。
密码错误时可能是自己没有root账户由于这里使用 python 工具包进行训练和测试,需要安装 python 工具包。进入 python 文件夹,运行以下命令安装:
python setup.py build
sudo python setup.py install-
下面我讲一下我的思路:
由于Task2根目录下的_CRFPP.so没有引入
所以正常能运行的是文件夹Task2_B-I下的内容,此文件夹下对词语分类只有B I两种
首先我用msr_training.utf8 通过python程序 make_crf_train_data.py转化成训练语料需要的格式,即tag_train_data.utf8,
然后我开始训练模型,得到model 再利用CRF自带的python工具包,对输入文本分词,具体实现是通过python程序 crf_segment.py ,
最后就将msr_test.utf8 分词得到 crf_tag_result.utf8.
crf_segment.py
#!/usr/bin/python# -*- coding: utf-8 -*-# crf_segmenter.py# Usage:python crf_segmenter.py crf_model test_file result_file# 利用CRF自带的python工具包,对输入文本进行分词import codecsimport sysimport CRFPPdef crf_segmenter(input_file, output_file, tagger): input_data = codecs.open(input_file, 'r', 'utf-8') output_data = codecs.open(output_file, 'w', 'utf-8') for line in input_data.readlines(): tagger.clear() for word in line.strip(): word = word.strip() if word: tagger.add((word + "\to\tB").encode('utf-8')) tagger.parse() size = tagger.size() xsize = tagger.xsize() for i in range(0, size): for j in range(0, xsize): char = tagger.x(i, j).decode('utf-8') tag = tagger.y2(i) if tag == 'B': output_data.write(' ' + char) elif tag == 'I': output_data.write(char) output_data.write('\n') input_data.close() output_data.close()if __name__ == '__main__': if len(sys.argv) != 4: print("Usage: python crf_segmenter.py crf_model test_file result_file") sys.exit() crf_model = sys.argv[1] input_file = sys.argv[2] output_file = sys.argv[3] tagger = CRFPP.Tagger("-m " + crf_model) crf_segmenter(input_file, output_file, tagger)
make_crf_train_data.py
#!/usr/bin/python# -*- coding: utf-8 -*-# make_crf_train_data.py# 得到CRF++要求的格式的训练文件# 用法:命令行--python dataprocess.py input_file output_fileimport sysimport codecs# 2 tags for character tagging: B Idef character_4tagging(input_file, output_file): input_data = codecs.open(input_file, 'r', 'utf-8') output_data = codecs.open(output_file, 'w', 'utf-8') for line in input_data.readlines(): word_list = line.strip().split() for word in word_list: if len(word) == 1: output_data.write(word + "\tB\n") else: output_data.write(word[0] + "\tB\n") for w in word[1:len(word) - 1]: output_data.write(w + "\tI\n") output_data.write(word[len(word) - 1] + "\tI\n") output_data.write("\n") input_data.close() output_data.close()if __name__ == '__main__': if len(sys.argv) != 3: print ("Usage: python dataprocess.py inputfile outputfile") sys.exit() input_file = sys.argv[1] output_file = sys.argv[2] character_4tagging(input_file, output_file)
如果还是不明白的,可以看我的GitHub,网址:https://github.com/angelamin/Python_study/tree/master/Task2/Task2_B-I
希望对跟我一样正在努力学习自然语言处理的童鞋们有帮助哦~
- CRF++中文分词使用指南
- CRF++中文分词
- CRF++中文分词
- CRF++ 中文分词
- CRF++ 中文分词
- CRF++的使用 CRF用于中文分词
- 基于CRF的中文分词
- 基于CRF的中文分词
- 基于CRF的中文分词
- 基于CRF的中文分词
- 基于CRF的中文分词
- 基于CRF的中文分词
- CRF中文分词标注器
- CRF++ 中文分词(转载)
- 基于CRF的中文分词
- CRF中文分词开源版发布啦
- 基于CRF的中文分词(ZT)
- CRF中文分词开源版发布啦
- Android软键盘弹出或关闭监控
- 有序列表和无序列表 学习笔记
- CSS 中 # 和 . 的区别
- 子线程是否可以刷新UI视图?
- hibernate3.3.2学习笔记--- 一个小实例
- CRF++中文分词
- ethercat 主 从站的建立
- android_04_线性布局
- HDU 5908 Abelian Period 模拟乱搞
- mvc加载composer且用composer加载medoo数据类
- 欢迎使用CSDN-markdown编辑器
- leetcode-3 Longest Substring Without Repeating Characters经典的动态规划问题
- dedecms后台所有档案列表和等待审核的档案重叠怎么办?
- 【牛腩新闻发布系统之发布遇错】