您的位置:首页 > 其它

手把手教你:解决pynlpir在ubuntu下不能分词的问题

2015-06-23 21:44 344 查看
引子:最近做的项目用到了pynlpir进行分词,但是发现在ubuntu环境下,对带有中文路径的文件不能进行分词

原因:直接调用pynlpir的分词文件函数:nlpir.FileProcess(sSrcFileName, sDstFileName, False)失败,应该是pynlpir在ubuntu环境下对中文路径的解析发生问题。

下面是我自己封装的一个函数,当然这个代码在windows环境下是可以对带有中文路径的文件分词成功的

from pynlpir import *
import codecs
def splitFile(sSrcFileName, sDstFileName):
    if not nlpir.Init(nlpir.PACKAGE_DIR, nlpir.UTF8_CODE, None):
        logging.INFO("初始化分词器失败")
        return False
    if isinstance(sSrcFileName , unicode):
        sSrcFileName = sSrcFileName.encode("utf-8")
    if isinstance(sDstFileName , unicode):
        sDstFileName = sDstFileName.encode("utf-8")
    nlpir.FileProcess(sSrcFileName, sDstFileName, False)
    nlpir.Exit()
    return True


解决方法:

既然我们直接调用它的分词文件函数不能成功,不妨换一个思路。我们自己循环读取文件每一行,对每一行分词,并将分词的结果写入到输出文件,基于这个思路,自己实现了如下的分词文件函数,在windows和ubuntu环境下对带有中文路径的文件分词进行测试,均成功。

本着王道论坛的:赠人玫瑰,收留余香的精神

我决定把这个困扰我一个多星期问题的解决代码贡献出来:

<pre name="code" class="python">from pynlpir import *
import codecs
# 自己封装的对文件进行分词的函数:循环读取文件每一行,对每一行的分词结果写入文件
def splitFile_bySentence(sSrcFileName, sDstFileName):
    if not nlpir.Init(nlpir.PACKAGE_DIR, nlpir.UTF8_CODE, None):
        logging.INFO("初始化分词器失败")
        return False
    #如果路径是unicode字符串,需要转换为由utf-8编码的普通字符串
    '''
    if isinstance(sSrcFileName , unicode):
        sSrcFileName = sSrcFileName.encode("utf-8")
    if isinstance(sDstFileName , unicode):
        sDstFileName = sDstFileName.encode("utf-8")
    '''
    #循环读取输入文件的每一行内容并进行分词,不要指定编码格式,否则发生错误
    #fr = codecs.open(sSrcFileName, "r", "utf-8")
    fr = codecs.open(sSrcFileName, "r")
    result = ""
    flag = True
    lines = fr.readlines()
    for line in lines:
        line = line.strip("\n").strip("\r")
        print "line:%s" % line
        if line:
            sResult = nlpir.ParagraphProcess(line, False)
            result += sResult + "\n"
    fr.close()
    if result != "":
        #outFile = codecs.open(sDstFileName, "w", "gbk")
        outFile = codecs.open(sDstFileName, "w")
        outFile.write(result)
        outFile.close()
    else:
        sErrorInfo = "对文件:%s 分词失败" % sSrcFileName
        print sErrorInfo
        logging.critical(sErrorInfo)
        flag = False
    nlpir.Exit()
    return flag



需要注意的一个问题:打开输入文件和输出文件时均不要指定编码方式,否则会发生错误
<pre name="code" class="python">fr = codecs.open(sSrcFileName, "r")
outFile = codecs.open(sDstFileName, "w")



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: