当前位置: 首页 > 工具软件 > python-nlpir > 使用案例 >

Python调用NLPIR/ICTCLAS进行文本分词

司空玮
2023-12-01

本文采用搜狗中文语料库mini版的文本数据,共九类(财经、IT、健康、体育、旅游、教育、招聘、文化、军事),每个类别共1990个文本,并在实验前通过.py程序抓取前500个文本数据作为训练集。

数据预处理包括文本分词、去停用词、词频统计、特征选择、采用向量空间模型表示文档等。接下的几篇博文将按照这几个歩棸对文本进行预处理。

文本分词主要通过Python调用中科院计算所汉语词法分析系统NLPIR/ICTCLAS的分词函数,由于本文使用的搜狗中文文本语料库中的每个类别都涉及多个文本,因此在分词时需要遍历文件夹中的文本,对文本进行批量分词处理,再保存到本地。在处理过程中可根据需要添加用户词典,使想保留的词不被拆分。分词结果包含文本中的所有字符,包括标点符号等。

博主使用的是32位的windows系统,以下是文本分词的代码:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = 'Peter_Howe<haobibo@gmail.com>'

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

from ctypes import * #Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数.访问dll,首先需引入ctypes库
libFile = './nlpir/NLPIR32.dll'
dll =  CDLL(libFile)

def loadFun(exportName, restype, argtypes):
    global dll
    f = getattr(dll,exportName)
    f.restype = restype
    f.argtypes = argtypes
    return f

class ENCODING:
    GBK_CODE        =   0               #默认支持GBK编码
    UTF8_CODE       =   GBK_CODE+1      #UTF8编码
    BIG5_CODE       =   GBK_CODE+2      #BIG5编码
    GBK_FANTI_CODE  =   GBK_CODE+3      #GBK编码,里面包含繁体字

class SegAtom(Structure):
    _fields_ = [("start", c_int32), ("length", c_int32),
        ("sPOS", c_char * 40),      ("iPOS", c_int32),
        ("word_ID", c_int32),       ("word_type", c_int32), ("weight", c_int32)
    ]

Init = loadFun('NLPIR_Init',c_int, [c_char_p, c_int, c_char_p])
ParagraphProcessA = loadFun('NLPIR_ParagraphProcessA',POINTER(SegAtom), [c_char_p, c_void_p, c_bool])

if not Init('',ENCODING.UTF8_CODE,''):
    print("Initialization failed!")
    exit(-111111)

def segment(paragraph):
    count = c_int32()
    result = ParagraphProcessA(paragraph, byref(count),c_bool(True))
    count = count.value
    atoms = cast(result, POINTER(SegAtom))
    return [atoms[i] for i in range(0,count)]

def Seg(paragraph):
    atoms = segment(paragraph) #调用segment()
    for a in atoms:
        if len(a.sPOS) < 1: continue
        i = paragraph[a.start: a.start + a.length]#.decode('utf-8')#.encode('type')
        yield (i, a.sPOS)


if __name__ == "__main__":
    for j in range(1, 10):
        for i in range(10, 1005):
            try:
                f = codecs.open('/Users/Administrator/Desktop/traintxt500/%d/%d.txt' % (j,i), 'r', "gb2312")
                p = f.read().encode("utf-8")  # 读入txt文件的所有内容
                print j, i
                for t in Seg(p):
                    s = '%s\t%s' % (t[0], t[1])  # 把一条分词结果赋给s,包括词性
                    b = open('/Users/Administrator/Desktop/wordsegresult500/%d/%d.txt' % (j,i), 'a')
                    b.write(s)
                    b.close()
                    b = open('/Users/Administrator/Desktop/wordsegresult500/%d/%d.txt' % (j,i), 'a')
                    b.write('\n')
                    b.close()
            except:
                    continue



 类似资料: