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

如何解决TextGrocery的python3兼容问题

令狐阳秋
2023-12-01
  • 最近在学习文本分类相关内容,看到了有资料用TextGrocery来做,所以想上手试一试。因为我用惯了python3,所以想在python3上做,但是发现了很多问题。下面我们对这些问题进行解决。

温馨提示:如果你是python2,完全可以直接用2做,真的没有必要用3(哭了,本人强迫症吧可能*~*)。

确认安装好相应包

首先我们要知道这个包只能在Linux环境下运行,我在windows下试过,安装包时不但要下载c++编译器等等一系列东西,还有python3的兼容问题,问题更多,所以我选择在Linux下安装

首先安装classifier

pip install classifier

然后安装tgrocery

pip install tgrocery

安装的步骤很简单,注意安装在你的python3路径下(用pip3安装,这里我的pip是软链接)。

改源文件

接下来我们就进入了漫长的改文件过程(准备好了么^ ~ ^),我们先用一个简单程序来测试安装成功与否,并改正:

 # coding=utf8
        from tgrocery import Grocery
        grocery = Grocery('test')
        train_src = [
            ('education', '名师指导托福语法技巧:名词的复数形式'),
            ('education', '中国高考成绩海外认可 是“狼来了”吗?'),
            ('sports', '法网孟菲尔斯苦战进16强 孟菲尔斯怒吼'),
            ('sports', '四川丹棱举行全国长距登山挑战赛 近万人参与')
        ]
        grocery.train(train_src)
        print(grocery.get_load_status())
        predict_result = grocery.predict('世锦赛石宇奇成功晋级四强')
        print(predict_result)
        print(predict_result.dec_values)

1.保存并运行程序后,提示

File “/usr/local/python3/lib/python3.6//init.py”, line 1, in <module >
from converter import *
ModuleNotFoundError: No module named ‘converter’

提示有‘’converter‘’库没有安装。这个converter模块并不是一个第三方库模块,而是site-packages/tgrocery路径下,模块安装包里面自己写的模块,调用自己同级文件夹模块,调用的错误 。所以我们需要

vi /usr/local/python3/lib/python3.6//init.py

进入到这个文件中,修改引用为

from .classifier import *
from .converter import *

2.然后再次运行代码,提示:

File"/usr/local/python3/lib/python3.6/site-packages/tgrocery/converter.py", line 2, in <module >
import cPickle
ModuleNotFoundError: No module named ‘cPickle’

python2中的cPickle模块在python3当中被整合到了pickle5当中,故需要在python3下安装pickle5,在终端输入

pip install pickle5

然后进入./converter.py(具体路径是你的python安装路径)这个文件:

vi  /usr/local/python3/lib/python3.6/site-packages/tgrocery/converter.py

把所有的cPickle都换成pickle5。

3.然后继续运行程序,提示:

File “/usr/local/python3/lib/python3.6/site-packages/tgrocery/converter.py”, line 6, in <module> from base import * ModuleNotFoundError: No module named ‘base’

这个错误与第一个错误类似,我们在终端进入./converter.py

vi  /usr/local/python3/lib/python3.6/site-packages/tgrocery/converter.py

然后base前加点

import .base

4.继续运行,提示:

File " /usr/local/python3/lib/python3.6/site-packages/tgrocery/base.py", line 54 print self.draw_table(^ SyntaxError: invalid syntax

这是python2与python3中输出语句格式不同造成的,需要进入./base.py,将print改为python3输出形式(即加括号)

    print( self.draw_table(
            zip(
                ['%.2f%%' % (s * 100) for s in self.accuracy_labels.values()],
                ['%.2f%%' % (s * 100) for s in self.recall_labels.values()]
            ),
            self.accuracy_labels.keys(),
            ('accuracy', 'recall')
        ) )

5.然后运行,提示:

File " /usr/local/python3/lib/python3.6/site-packages/tgrocery/classifier.py", line 5, in <module>from converter import GroceryTextConverter ModuleNotFoundError: No module named ‘converter’

同样进入./classifier.py这个文件,终端输入

vi /usr/local/python3/lib/python3.6/site-packages/tgrocery/classifier.py

加点

from .converter import GroceryTextConverter
from .learner import *
from .base import *

6.运行后,提示:

File “/usr/local/python3/lib/python3.6/site-packages/tgrocery/classifier.py”, line 51, in predict_text
if isinstance(text,unicode):
NameError: name ‘unicode’ is not defined

classifier.py中没有unicode这个类型,这是因为python3中把unicode换成了str,不信你可以在python2和python3中输入Unicode。所以我把第50行开始的两个unicode改成str:

 #process unicode type
 if isinstance(text,str):
    text = text.encode('utf-8')
 if not isinstance(text,str):
    raise TypeError('The argument should be plain text')

7.然后运行之后又发现出现这个提示:

File “/usr/local/python3/lib/python3.6/site-packages/tgrocery/classifier.py”, line 54, in predict_text
raise TypeError(‘The argument should be plain text’)
TypeError: The argument should be plain text

我查了一下资料大概意思是说这个地方是用来纠正你输入的文本的,如果输入的编码与设定的不合适,就会报错。(我的理解是这样)然后我就试了试把不满足这个条件的语句删除(当然你也可以尝试把它改成其他适合你自己的语句),即删除下面,下面两条语句:

 if not isinstance(text,str):
               raise TypeError('The argument should be plain text')

8.运行结果:

Building prefix dict from the default dictionary …
Loading model from cache /tmp/jieba.cache
Dumping model to file cache /tmp/jieba.cache
*
optimization finished, #iter = 3
Objective value = -1.096516
nSV = 8
True
sports
{‘education’: -0.03144702530597886, ‘sports’: 0.03144702530597885}
Dump cache file failed.
Traceback (most recent call last):
File “/usr/local/python3/lib/python3.6/site-packages/jieba/init.py”, line 152, in initialize
_replace_file(fpath, cache_file)
PermissionError: [Errno 1] Operation not permitted: ‘/tmp/tmpcsxn0rwt’ -> '/tmp/jieba.cache’

Loading model cost 0.961 seconds.
Prefix dict has been built succesfully.
Process finished with exit code 0

我们可以看到基本可以成功运行,但是还有一个问题(加粗部分):没有jieba.cache。因为jieba想要在系统根目录创建缓存文件/tmp/jieba.cache来存储模型,然而用户没有权限。
解决办法是修改默认缓存文件的目录,把缓存文件放在用户的目录下面。于是我们进入__init__.py文件

vi /usr/local/python3/lib/python3.6/site-packages/jieba/__init__.py

找到第64行

self.tmp_dir = None

把jieba.cache添加到你的jieba路径下,你可以通过安装python3路径下的lib中查找,修改如下(相当于创建文件jieba.cache)

self.tmp_dir = "/usr/local/python3/lib/python3.6/site-packages/jieba/"

9.最终运行后结果:

/usr/bin/python3 /home/zyy/PycharmProjects/textexercise/2.py
Building prefix dict from the default dictionary …
Loading model from cache /usr/local/python3/lib/python3.6/site-packages/jieba/jieba.cache
*
optimization finished, #iter = 3
Objective value = -1.096516
nSV = 8
True
sports
{‘education’: -0.03144702530597886, ‘sports’: 0.03144702530597885}
Loading model cost 0.746 seconds.
Prefix dict has been built succesfully.
Process finished with exit code 0

以上就是我所做的工作,耗费了很大的精力,但是在一定程度上了解这两个版本的python。如果用其他实例分类结果不准,可能是训练样本太少,试着添加更多的样本。
上面的修改我不知道会不会在以后的工作中报错,但目前是可行的。
(多多鼓励啊 * -* !*- * ! * - *)

 类似资料: