使用NLPIR 进行中文分词并标注词性

原创 2017年07月29日 00:24:25

背景

在许多时候为了更好的解析文本,我们不仅仅需要将文本分词,去停这么简单,除了获取关键词与新词汇以外,我们还需要对获取每个粒度的其他信息,比如词性标注,在python中NLPIR就可以很好的完成这个任务,如果你没有NLPIR那么你可以参考这篇文章NLPIR快速搭建,或者直接下载我已经准备好的汉语自然语言处理文件包NLP源码集合

代码,亦是我的笔记

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

import nltk
import sys
import nlpir

sys.path.append("../")

reload(sys)
sys.setdefaultencoding('utf-8')

import jieba
from jieba import posseg


def cutstrpos(txt):
    # 分词+词性
    cutstr = posseg.cut(txt)
    result = ""
    for word, flag in cutstr:
        result += word + "/" + flag + ' '
    return result


def cutstring(txt):
    # 分词
    cutstr = jieba.cut(txt)
    result = " ".join(cutstr)
    return result


# 读取文件
txtfileobject = open('txt/nltest1.txt')
textstr = ""
try:
    filestr = txtfileobject.read()
finally:
    txtfileobject.close()


# 使用NLPIR2016 进行分词
def ChineseWordsSegmentationByNLPIR2016(text):
    txt = nlpir.seg(text)
    seg_list = []

    for t in txt:
        seg_list.append(t[0].encode('utf-8'))

    return seg_list


stopwords_path = 'stopwords\stopwords1893.txt'  # 停用词词表


# 去除停用词
def ClearStopWordsWithListByNLPIR2016(seg_list):
    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)


# print filestr
filestr2 = ClearStopWordsWithListByNLPIR2016(ChineseWordsSegmentationByNLPIR2016(filestr)).replace(' ', '')

# 中文分词并标注词性
posstr = cutstrpos(filestr2)

print '**** show is end ****'

print ' '
print 'This is posster'
print posstr

strtag = [nltk.tag.str2tuple(word) for word in posstr.split()]
# for item in strtag:
#     print item
strsBySeg = nlpir.seg(filestr)
strsBySeg2 = nlpir.seg(filestr2)
strsByParagraphProcess = nlpir.ParagraphProcess(filestr, 1)
strsByParagraphProcessA = nlpir.ParagraphProcessA(filestr, ChineseWordsSegmentationByNLPIR2016(filestr)[0], 1)

print ' '
print ' '
print '**** strtag ****'

for word, tag in strtag:
    print word, "/", tag, "|",

print ' '
print ' '
print '**** strsBySeg ****'
for word, tag in strsBySeg:
    print word, "/", tag, "|",

print ' '
print ' '
print '**** strsBySeg2 ****'
for word, tag in strsBySeg2:
    print word, "/", tag, "|",

print ' '
print ' '
print '**** strsByParagraphProcess ****'
print strsByParagraphProcess

# print ' '
# print ' '
# print '**** strsByParagraphProcessA ****'
# 
# for item in strsByParagraphProcessA:
#     print item,

print ' '
print ' '
print '**** show is end ****

实用示例

NLPIR会自动对人名进行分词与标注,借助该功能我们可以获取自定义新词,或者提取与某类人有关的句子.下面是我前段时间在写一个项目demon时刚写的测试代码

# - * - coding: utf - 8 -*-
#
# 作者:田丰(FontTian)
# 创建时间:'2017/7/11'
# 邮箱:fonttian@Gmaill.com
# CSDN:http://blog.csdn.net/fontthrone
from os import path
from scipy.misc import imread
import matplotlib.pyplot as plt
import jieba
from nlpir import *
from wordcloud import WordCloud, ImageColorGenerator
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
d = path.dirname(__file__)

text = '接待钟世镇院士,筹备杨东奇部长接待事宜。'
stopwords_path = 'stopwords\CNENstopwords.txt'  # 停用词词表
number = 10

def ShowByItem(List):
    print '********* show ', str(List), ' end *********'
    for item in List:
        print item,
    print
    print '********* show ', str(List), ' end *********'

#  使用NLPIR2016 获取名字
def FindAcademicianNameByNLPIR2016(text,isAddYuanShi):
    txt = seg(text)
    seg_list = []

    for i in range(len(txt)):
        if txt[i][1] == 'nr' and txt[i+1][0] == '院士':
            if isAddYuanShi == 1:
                seg_list.append(txt[i][0].encode('utf-8')+'院士')
            else:
                seg_list.append(txt[i][0].encode('utf-8'))


    return seg_list

str2 = FindAcademicianNameByNLPIR2016(text,1)

ShowByItem(str2)


# 输出
********* show  ['\xe9\x92\x9f\xe4\xb8\x96\xe9\x95\x87\xe9\x99\xa2\xe5\xa3\xab']  end 
钟世镇院士
********* show  ['\xe9\x92\x9f\xe4\xb8\x96\xe9\x95\x87\xe9\x99\xa2\xe5\xa3\xab']  end 

在demon中使用的

使用NLPIR2016 获取名字
def FindAcademicianNameByNLPIR2016(text,isAddYuanShi):
    txt = seg(text)
    seg_list = []

    for i in range(len(txt)):
        if txt[i][1] == 'nr' and txt[i+1][0] == '院士':
            if isAddYuanShi == 1:
                seg_list.append(txt[i][0].encode('utf-8')+'院士')
            else:
                seg_list.append(txt[i][0].encode('utf-8'))


strAcademicianName = FindAcademicianNameByNLPIR2016(fullContent,1)
strAcademicianName = list(set(strAcademicianName))
# 利用pandas存储
dfAcademicianName = pd.DataFrame(strAcademicianName)
dfAcademicianName.columns = ['AcademicianName']
dfAcademicianName.to_csv('csv/dfAcademicianName')
# 利用Pandas 获取
dfNewWords = pd.read_csv("csv/dfNewWords")
dfAcademicianName = pd.read_csv("csv/dfAcademicianName")

# 你也可以将其加入用户新词汇
# add_word(dfAcademicianName['AcademicianName'])

# 提取所有带有院士的报告
def GetAcademicianCSV(df,strColumn,df1):
    dfAcademicianName = pd.read_csv("csv/dfAcademicianName")
    listAcademicianName = list(dfAcademicianName['AcademicianName'])
    print type(listAcademicianName)

    mywordlistAcademicianName =[]
    mywordlisttime = []
    mywordAca = []
    df1 = df1.copy()
    numlen = len(df1.index)
    for i in range(numlen):
        for myword in df1.loc[i, strColumn].split():
            if (myword in listAcademicianName) and len(myword) > 1:
                print myword
                mywordlistAcademicianName.append(df.loc[i, strColumn])
                mywordAca.append(myword)
                mywordlisttime.append(df.loc[i, 'time'])

    return mywordlistAcademicianName,mywordlisttime,mywordAca

# 返回的信息
mywordlistAcademicianName, mywordlisttime,mywordAca = GetAcademicianCSV(df,'content',df1)

效果如下

获取的院士名字

获取的院士报告

版权声明:欢迎转载,共同学习,但请尊重版权,标明出处:http://blog.csdn.net/fontthrone

清华大学thulac分词和词性标注代码理解

清华大学的thulac中分分词词法包,包含有中文分词和词性标注,从测试精度和速度看,效果还不错,github上有提供c++和python代码,c++代码包含有训练和测试代码,python代码只有测试代...
  • u011961856
  • u011961856
  • 2017年01月15日 15:46
  • 2594

中文分词词性对照表

汉语词性对照表[北大标准/中科院标准]     词性编码 词性名称 注 解 Ag 形语素 形容词性语素。形容词代码为 a,语素...
  • kevin_darkelf
  • kevin_darkelf
  • 2014年09月24日 11:12
  • 18009

Python 文本挖掘:jieba中文分词和词性标注

最近NLP新词发现及情感倾向性分类
  • u010454729
  • u010454729
  • 2014年10月26日 13:26
  • 14513

统计自然语言处理梳理一:分词、命名实体识别、词性标注

进行统计自然语言处理系统梳理,学习资料《统计自然语言处理.宗成庆》。 一、自动分词          词,词是最小的能够独立运用的语言单位。          自动分词问题由来。中文(还有日语、...
  • alihonglong
  • alihonglong
  • 2016年08月27日 08:09
  • 6249

中文分词与词性标注

概况介绍中文分词与词性标注是自然语言处理的第一个阶段,是上层处理的基础。分词的主要研究内容是歧义切分和未登录词识别。歧义切分是指对同一个文字片断具有不同的切分方式,如“结合成分子”这句话就有好几种切分...
  • yaoxy
  • yaoxy
  • 2009年06月22日 11:20
  • 3232

带词性标注的中文分词词典

  • 2015年07月28日 09:34
  • 626KB
  • 下载

中文自动分词和词性标注

  • 2011年12月31日 19:32
  • 7.34MB
  • 下载

使用NLPIR-ICTCLAS2014分词系统

使用NLPIR-ICTCLAS2014分词系统
  • zengraoli
  • zengraoli
  • 2014年08月04日 14:08
  • 29896

java调用NLPIR(ICTCLAS2016)实现分词功能

本文为博主 http://blog.csdn.net/churximi 原创文章   备注:win7 64位系统,netbeans编程     NLPIR分词系统,前身是200...
  • wiwiane
  • wiwiane
  • 2017年02月16日 00:14
  • 1966

NLPIR分词使用说明

NLPIR系统授权,基本上1个月要授权一次,在这里替换Data/NLPIR.user即可给出一个分词的使用实例: 1:上官网下载分词工具包2:随便新建一个Java工程;3:把jna.jar放到cla...
  • yuhushangwei
  • yuhushangwei
  • 2016年12月27日 16:34
  • 785
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用NLPIR 进行中文分词并标注词性
举报原因:
原因补充:

(最多只允许输入30个字)