当前位置:首页 > 操作系统 > Linux

jieba分词单例模式及linux权限不够情况下tmp_dir自定义

在linux环境下,没有root权限的情况下,有时会碰到如下问题:

            Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Dumping model to file cache /tmp/jieba.cache
Dump cache file failed.
Traceback (most recent call last):
  File "/home/work/anaconda3/envs/py27/lib/python2.7/site-packages/jieba/__init__.py", line 153, in initialize
    _replace_file(fpath, cache_file)
OSError: [Errno 1] Operation not permitted

 

这是因为jieba默认情况下在/tmp下存储缓存文件,然而不是root用户,权限不够。解决办法是修改默认缓存文件的目录,把缓存文件放在用户的目录下面。 jieba文档提到了tmp_dir和cache_file可以改,所以我们查看了下源码

/home/work/anaconda3/envs/py27/lib/python2.7/site-packages/jieba/__init__.py,文件52行-66行如下:
class Tokenizer(object):

    def __init__(self, dictionary=DEFAULT_DICT):
        self.lock = threading.RLock()
        if dictionary == DEFAULT_DICT:
            self.dictionary = dictionary
        else:
            self.dictionary = _get_abs_path(dictionary)
        self.FREQ = {}
        self.total = 0
        self.user_word_tag_tab = {}
        self.initialized = False
        self.tmp_dir = None
        # self.tmp_dir = /
        self.cache_file = None

修改源码,在64行self.tmp_dir中可以设置自定义缓存路径。 

 

另外一种方式是在代码中修改,以下是jieba单例模式demo

             1
            class
             Singleton(object):

             2
            """
             3
                Jieba Utils Class

             4
            """
             5     _instance = None
 6 7def__new__(cls, *args, **kwargs):
 8ifnot cls._instance:
 9             cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
10return cls._instance
111213class JiebaUtil(Singleton):
14"""15    jiebautil 工具包
16"""17     _jieba_instance = None
1819def get_instance(self):
20"""21        get the global jieba instance
22"""23if self._jieba_instance:
24return self._jieba_instance
25printinitialize...26         obj = jieba.Tokenizer()
27         obj.tmp_dir = dirpath
28        obj.load_userdict(user_dict_path)
29        obj.initialize()
30         self._jieba_instance = obj
31return obj
323334if__name__ == __main__:
3536     one = JiebaUtil()
37     two = JiebaUtil()
3839print one == two
4041     tkn = one.get_instance()
42     tkn2 = one.get_instance()
43print tkn == tkn2
4445print id(one), id(two)
4647print id(tkn), id(tkn2)

 

在27行中可以设置自定义的他们tmp_dir缓存路径。

 

参考:

http://funhacks.net/2017/01/17/singleton/

https://blog.csdn.net/sijiaqi11/article/details/78601258

 

原文:https://www.cnblogs.com/shizhh/p/10599931.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐