Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握

前叙

博主写这篇文章使用了八十分钟,阅读需要十五分钟,读完之后你将会学会在Python中使用NLPIR2016.如果你花费更多的时间练习后半部分的例子,你将能够在一天内学会在Python中使用NLPIR2016的全部所需知识
如果你想要获取更详细的API翻译,你需要进一步学习ctypes,附赠一篇关于API翻译,虽然是java语言的,但是NLPIR的接口翻译都是一样的
http://blog.csdn.net/fontthrone/article/details/72882938
我决定上传一下有关NLP的博客中的源码:
http://blog.csdn.net/fontthrone/article/details/72885329

如何使用接口

将打包好的[组合包]下所有内容拖入你的项目,然后开始在你的py文件中通过引用nlpir中的方法使用NLPIR2016

#如果想要使用NLPIR需要的基本的配置
from nlpir import *
# 在引用nlpir之后就可以按照引用其他py文件的一般方法使用NLPIR2016
from ctypes import *
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# 在Python2.x中需要配置文件的默认编码这样可以避免很多编码问题
from os import path
d = path.dirname(__file__)
# 获取当前路径,在后续的许多代码中可能需要使用该路径
text_path = 'txt/lztest.txt' #设置要分析的文本路径
stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表
text = open(path.join(d, text_path)).read()
txt = seg(text)
seg_list =[]
for t in txt:
    seg_list.append(t[0].encode('utf-8'))
    # seg_list += ' '
# 使用NLPIR进行中文分词
print seg_list
# 直接输出 seg_list会出现乱码
for j in seg_list:
    print j
# 显示效果如下图

seg分词后的效果

用户自定义词库的两种方式

1. 修改NLPIR的词库

想要修改NLPIR的词库你可以阅读官方的文档,其方法为”汉语分词20140928\importuserdict\Readme.txt”
下面为其中内容:

采用附件的小工具,可以实现脱机导入用户词典;具体步骤如下:
1.与分词Data文件夹同级建立 bin目录,下面建立二级目录ICTCLAS2014;
2.将附件的内容解压缩后放在ICTCLAS2014下面;
3.编辑bin/ICTCLAS2014下面的userdic.txt,这里放置用户词典与标注;
4.执行bin/ICTCLAS2014的批处理文件。即可导入用户词典到Data目录下的field.pdat field.pos5.30万词条会划分更多的时间,可能需要2小时左右。

2.在代码中动态引用与删除用户自定义词库

#下面代码中loadFun的参数c_int,c_uint等为ctype类型,在下文中我会有部分介绍,其足以满足一般的使用,但是想要深入学习,你需要自己学习该部分
# nlpir的源代码
ImportUserDict = loadFun('NLPIR_ImportUserDict',c_uint, [c_char_p])
# 从txt文件中导入用户词典
AddUserWord = loadFun('NLPIR_AddUserWord', c_int, [c_char_p])
# 添加用户自定义词语
SaveTheUsrDic = loadFun('NLPIR_SaveTheUsrDic', c_int, None)
# 将用户词典保存到硬盘
DelUsrWord = loadFun('NLPIR_DelUsrWord',c_int, [c_char_p])
# 删除用户的自定义词语


# 例子
AddUserWord('龙族')
AddUserWord('路明非')
AddUserWord('大和炮')
AddUserWord('竞技类')
DelUsrWord('竞技类')
# 注意在NLPIR的默认分词格式中会识别汉语名字,但是测试发现:即使在某个句子中,将一个名字,比如'路明非'分词成功了,但是在其他句子中并不一定能够正确分词,如果你想更好地使用分词功能,可以和下一个部分中的提取新词配合使用

提取新词与关键字

text_path = 'txt/lztest.txt' #设置要分析的文本路径
text = open(path.join(d, text_path)).read()
txt = seg(text)
kw_list =[]
seg_list =[]

# 获得新词,第二个参数控制新词的个数,排名按照TF-IDF(term frequency–inverse document frequency排序
# 该功能可以和AddUserWord()方法配合使用,以更好地获取分词效果
strs1 = GetNewWords(text,c_int(10),[c_char_p, c_int, c_bool])
print strs1
# 获得新词(从txt文件中),第二个参数控制新词的个数,排名按照TF-IDF(term frequency–inverse document frequency排序
# strs10 = GetFileNewWords(text,c_int(10),[c_char_p, c_int, c_bool])
# print strs10
# WindowsError: exception: access violation reading 0x0000000000000000
# 获得关键词,第二个参数控制新词的个数,排名按照TF-IDF(term frequency–inverse document frequency排序
strs2= GetKeyWords(text,c_int(10),[c_char_p, c_int, c_bool])
print strs2

演示效果如下:
Python中使用NLPIR2016获取新词与提取关键字
其中第一部分(比如”富山雅史”)为词语,第二部分(n_new为新词)为词性,第三部分为权重(TF*IDF)

使用停用词的实例

# - * - coding: utf - 8 -*-
#
# 作者:田丰(FontTian)
# 创建时间:'2017/5/31'
# 邮箱:fonttian@163.com
# CSDN:http://blog.csdn.net/fontthrone

from os import path
from nlpir import *
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
from ctypes import *
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

d = path.dirname(__file__)
# 添加用户自定义词语
AddUserWord('龙族')
AddUserWord('路明非')
AddUserWord('大和炮')
AddUserWord('竞技类')

text_path = 'txt/lztest.txt' #设置要分析的文本路径
stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表
text = open(path.join(d, text_path)).read()
txt = seg(text)
seg_list =[]

for t in txt:
    seg_list.append(t[0].encode('utf-8'))
    # seg_list += ' '
# 使用NLPIR进行中文分词

# 去除停用词
def NLPIRclearText(text):
    mywordlist = []
    liststr = "/ ".join(seg_list)
    f_stop = open(stopwords_path)
    try:
        f_stop_text = f_stop.read()
        f_stop_text = unicode(f_stop_text, 'utf-8')
    finally:
        f_stop.close()
    f_stop_seg_list = f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not (myword.strip() in f_stop_seg_list) and len(myword.strip()) > 1:
            mywordlist.append(myword)
    return ''.join(mywordlist)

# 去除完停用词的文本
s = NLPIRclearText(seg_list)
print s

结果如下:
Python使用NLPIR2016进行中文分词

使用中的可能会遇见的一些问题

  1. ctype的问题,想要更好地在Python中使用NLPIR2016,你需要了解该部分
  2. 控制台输出utf-8编码格式中文显示乱码,这个在windows中比较常见,原因是控制台的默认中文编码为gbk或者或者其他格式
  3. 进一步掌握文章中未介绍的部分方法,你可以直接浏览nlpir.py文件或者参考这篇文章:http://blog.csdn.net/fontthrone/article/details/72882938
  4. 在Python3中使用NLPIR2016,这个你只需要参考官网的文档即可,这个我就不再做过介绍了
  • 16
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: 结构化感知机是一种常用的序列标注模型,可以用来实现汉语分词任务。Python是一种高级编程语言,提供了丰富的机器学习和自然语言处理的工具库。 在使用Python实现结构化感知机模型时,我们首先需要准备训练数据。对于汉语分词任务来说,可以使用标注好的语料作为训练数据,其中每个词都标注有对应的词性。 接下来,我们可以使用Python中的相关库,如nltk或sklearn来构建结构化感知机模型。这些库提供了训练和预测模型的函数和类。 在构建模型时,我们需要定义特征函数。特征函数是根据当前状态和输入特征来计算得分的函数。对于汉语分词任务,可以使用一些常见的特征,如前后字的词频、句子中的位置等。特征函数可以根据需求进行自定义。 然后,我们使用训练数据来训练结构化感知机模型。训练过程中,模型会通过不断迭代来调整特征权重,以使得模型能够更好地预测出正确的分词结果。 最后,我们可以使用训练好的模型来对新的句子进行分词预测。预测过程中,模型会根据当前状态和特征函数计算得分,并选取得分最高的分词结果作为预测结果。 总之,通过使用Python中的结构化感知机模型和相应的库,我们可以实现汉语分词任务。该方法可以根据训练数据自动学习得到合适的分词模型,从而实现对汉语文本的分词。 ### 回答2: 结构化感知机是一种常用于自然语言处理的机器学习模型,可以用来实现汉语分词任务。Python是一种常用的编程语言,拥有丰富的机器学习和自然语言处理库。 在使用Python实现结构化感知机模型进行汉语分词时,需要首先准备好标注好的训练数据集。可以使用字或词作为特征,将每个字或词标注为分词的起点、中间或终点。然后,利用Python的机器学习库,如scikit-learn或TensorFlow,构建结构化感知机模型。 在模型训练阶段,可以使用Python的机器学习库提供的函数,将输入的训练数据集转换为特征向量和对应的标注信息。然后,通过调用结构化感知机模型进行训练,将特征向量和对应的标注信息输入给模型进行学习和参数调整,以提高模型对汉语分词的准确性和泛化能力。 在模型训练完成后,可以使用Python编写代码来加载模型,并将待分词汉语句子转化为特征向量。然后,通过调用模型进行预测,将特征向量输入给模型,获取分词的结果。最后,可以将分词结果输出为字符串形式,完成汉语分词的任务。 总结而言,通过使用Python的机器学习库和结构化感知机模型,可以实现汉语分词任务。这种方法可以根据标注数据进行训练,然后将训练好的模型应用于新的输入数据,实现分词功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Font Tian

写的很好,请给我钱

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

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

打赏作者

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

抵扣说明:

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

余额充值