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

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

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

  1. /home/work/anaconda3/envs/py27/lib/python2.7/site-packages/jieba/__init__.py,文件52行-66行如下:
  1. class Tokenizer(object):
  2.  
  3. def __init__(self, dictionary=DEFAULT_DICT):
  4. self.lock = threading.RLock()
  5. if dictionary == DEFAULT_DICT:
  6. self.dictionary = dictionary
  7. else:
  8. self.dictionary = _get_abs_path(dictionary)
  9. self.FREQ = {}
  10. self.total =
  11. self.user_word_tag_tab = {}
  12. self.initialized = False
  13. self.tmp_dir = None
  14. # self.tmp_dir = '/'
  15. self.cache_file = None

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

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

  1. class Singleton(object):
  2. """
  3. Jieba Utils Class
  4. """
  5. _instance = None
  6.  
  7. def __new__(cls, *args, **kwargs):
  8. if not cls._instance:
  9. cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
  10. return cls._instance
  11.  
  12. class JiebaUtil(Singleton):
  13. """
  14. jiebautil 工具包
  15. """
  16. _jieba_instance = None
  17.  
  18. def get_instance(self):
  19. """
  20. get the global jieba instance
  21. """
  22. if self._jieba_instance:
  23. return self._jieba_instance
  24. print 'initialize...'
  25. obj = jieba.Tokenizer()
  26. obj.tmp_dir = dirpath
  27. obj.load_userdict(user_dict_path)
  28. obj.initialize()
  29. self._jieba_instance = obj
  30. return obj
  31.  
  32. if __name__ == '__main__':
  33.  
  34. one = JiebaUtil()
  35. two = JiebaUtil()
  36.  
  37. print one == two
  38.  
  39. tkn = one.get_instance()
  40. tkn2 = one.get_instance()
  41. print tkn == tkn2
  42.  
  43. print id(one), id(two)
  44.  
  45. print id(tkn), id(tkn2)

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

参考:

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

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

jieba分词单例模式及linux权限不够情况下tmp_dir自定义的更多相关文章

  1. linux在telnet情况下root登录提示login incorrect

    root登录时总是提示 login incorrect SSH可以登录 别的用户也可以通过telnet登录 唯独root不可以   解决方法: vi /etc/pam.d/login # auth r ...

  2. sqlserver修改sa密码(在windows登陆没有权限的情况下)

    对于windows用户没有权限执行alter login sa enable的情况下,采用如下方法可以成功修改sa密码登陆. . 用Run as a administrator打开命令提示符里输入NE ...

  3. ios --xib自定义,解决在导航栏不透明的情况下,自定义xib view高度被压缩64的问题

    在使用xib自定义view的时候,个人习惯性的直接使用xib中的约束,所以自然而然的要打开Autolayout.以前在使用的时候没有发现什么问题,最近项目中使用的时候突然发现在导航栏透明的情况下,出现 ...

  4. linux无网络情况下安装rpm包

    首先理清楚两个东西:rpm和yum.rpm全称redhat package manager,用来管理软件包:yum全称yellow dog updater,modified,它是rpm的前端程序,因为 ...

  5. 在无修改权限的情况下修改文件hosts中的内容

    今天遇到了一个问题,本来希望修改hosts中的内容,但保存时被告知无权限,网上搜索有很多方法都无效,最后搜到一个简单的方法:将hosts文件复制到桌面上,修改,然后覆盖原来位置的hosts文件即可!

  6. 在没有创建Provision Profile权限的情况下 发布Enterprise inhouse app 的方法

    由于用普通开发者证书,发布的app或ipa没法在普通机器上安装运行,原因是apple限制了普通开发者发布appstore以外的环境中,只有Enterprise企业版证书才能发布inhouse. 今天在 ...

  7. Linux权限管理.md

    Linux 文件的权限 Linux文件权限简介 Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: # ...

  8. 自然语言处理之jieba分词

    在处理英文文本时,由于英文文本天生自带分词效果,可以直接通过词之间的空格来分词(但是有些人名.地名等需要考虑作为一个整体,比如New York).而对于中文还有其他类似形式的语言,我们需要根据来特殊处 ...

  9. python结巴(jieba)分词

    python结巴(jieba)分词 一.特点 1.支持三种分词模式: (1)精确模式:试图将句子最精确的切开,适合文本分析. (2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解 ...

随机推荐

  1. Ubuntu中实现Docker内安装jenkins+jenkins远程触发

    前面做了在ubuntu中安装jenkins+docker实现自动部署,但是得安装jdk8+tomcat8环境,比较麻烦,因此本文记录如何将jenkins直接装在dockers内并且实现远程触发功能. ...

  2. 在 Visual Studio 中使用 Q# 进行量子编程

    1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...

  3. diff算法(核心)

    ps:大致转载知乎文章 vue和react的虚拟dom都采用类似的diff算法,核心大概可以归为两点 1,两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构: 2,同一层级的一组节点, ...

  4. python数组的复制问题

    1.a=[2,3,4,5] b=a 只是将b指向a,对b的操作会影响a 2.如果需要对b操作,不影响a b=a[:]

  5. Delphi 访问https /SSL、OpenSSL

    访问 Web 网站,最简单用法直接使用 TIdHTTP 控件: 例如:AA := IdHTTP1.Get('www.baidu.com.'); 访问 https 的网站,需要 SSL 库. 在 Win ...

  6. c++11 继承构造函数

    若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类. struct A { A(int i) {} A(double d, int i) ...

  7. PHP curl_reset函数

    curl_reset— 重置libcurl会话句柄的所有选项. 说明 void curl_reset ( resource $ch ) 该函数将重新初始化cURL的所有选项值(默认值). 注意:cur ...

  8. configure: error: libXpm.(a|so) not found

    libXpm-devel明明已经安装过了,libXpm.so之类的也都存在,但是还是一直报这个问题, 百度了很长时间,终于找到了: configure一般的搜索编译路径为/usr/lib/下,因为ph ...

  9. 【数据库】一篇文章搞掂:SQL Server数据库

    问题: 1.同一段代码,在存储过程中运行比普通SQL执行速度慢几十倍 原理: 在SQL Server中有一个叫做 “Parameter sniffing”参数嗅探的特性.SQL Server在存储过程 ...

  10. Django中的HttpRequsest 和Httpresponse对象

    HttpRequest对象:每一个用户请求在到达视图函数的同时,django会自动创建一个HttpRequest对象并把这个对象当做第一个参数传给要调用的views方法,HttpRequest对象里封 ...