PYTLP模型安装及使用(linux+python3)

5 篇文章 0 订阅
2 篇文章 0 订阅

记一次曲折的使用经历。。

1. 需要运行在python3下面,先升级服务器的python版本

找一个下载目录

wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0a1.tar.xz 

解压缩

tar xvf Python-3.8.0a1.tar.xz 

创建安装目录

mkdir /usr/local/python3

进入解压后的目录后执行

../configure --prefix=/usr/local/python3

make && make install

2. 安装pyltp

用pip3 install没成功,改用git自己编译安装

先下载:

$ git clone https://github.com/HIT-SCIR/pyltp

报错:fatal: unable to access 'https://github.com/HIT-SCIR/pyltp/': Peer reports incompatible or unsupported protocol version.

是git的原因,解决办法:

yum update -y nss curl libcurl

下载成功后进入pyltp目录,执行

$ git submodule init
$ git submodule update

下载模型源码放到pyltp的目录下,并命名为ltp:

https://github.com/HIT-SCIR/ltp/releases

在这里插入图片描述

我因为已经提前下载过了,所以可以直接用nc命令传到服务器上。今天才知道nc,简直太好用了,喜极而泣:

顺手分享到这里:

s1. 接收方: nc -l 1234 > filename (先在接收方的机器上执行这条命令,打开1234端口,服务器可用 nc -l4 强制使用ipv4传输)

s2. 发送方: nc 10.X.X.X 1234 < filename (在发送方的机器上执行这条命令,把1.txt通过端口1234发送到10.X.X.X这个机器上,10.X.X.X是接收方的ip地址)

回到正题

开始安装:

sudo python3 setup.py install

重点来了,因为我没有把python3设置为默认的python版本,因此安装的时候要执行sudo python3 setup.py install 而不是sudo python setup.py install。

报错:

patch/libs/python/src/converter/builtin_converters.cpp: In function ‘void* boost::python::converter::{anonymous}::convert_to_cstring(PyObject*)’:

patch/libs/python/src/converter/builtin_converters.cpp:51:64: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]

return PyUnicode_Check(obj) ? _PyUnicode_AsString(obj) : 0;

^

error: command 'gcc' failed with exit status 1

是c++和c的差别,c允许包括const void* 转换为void*指针类型,但c++不让,所以就gcc报错了。

找到报错文件patch/libs/python/src/converter/builtin_converters.cpp,把51行加一个(void*)类型转换。

感谢踩了n多坑的大神:https://blog.csdn.net/qq_36213262/article/details/89373268

PS:mac安装的时候会遇到各种7788的问题,请参考下面这篇文章,很管用。

mac 安装pyltp:

https://blog.csdn.net/lingan_Hong/article/details/88027975

3. 模型使用。

我用的是pltp模型的命名体识别-地理信息识别,参考的是这位大神的文章(有github代码):

https://www.cnblogs.com/bincoding/p/9180553.html

作者是用django写了个页面,获取待分析文本,我就直接借用大神的address_extract.py脚本。

下载模型,修改脚本中的模型文件地址,调通脚本。

执行效果,给出语句setence:

"【来稿选登:青海省西宁市城东区,隐藏在高楼内部的清真寺】#坚持宗教中国化方向# ​";

返回结果:青海省,西宁市,城东区

首先,要注意mac的地址跟windows的不一样,mac和linux是斜杠/, windows是反斜杠\;

其次,脚本执行和IDE执行py文件的时候,通过os.path获取的相对路径是不一样的,注意修改。

project_path = os.path.abspath(os.path.dirname(pwd) + os.path.sep + ".")

4. java调用的问题

(1)尝试runtime方式

我的主工程是java,最开始我采用的是runtime直接调用python脚本的形式,好不容易把恼火的路径问题解决,最后又栽到了docker环境上。不用docker的还是可以用这种方式。

a. 相对地址

用java的URL classpath=ClassLoader.getSystemResource(""); 获取的classpath,如果存在n个bootstrap就会很麻烦。例如这个地址处理的在common类里,其它n个webbootrap来调用,每个bootrap获取到的classpath都不一样,因此就不好处理出一个顺心的相对地址来获取py脚本。

b. docker

我在物理机上配置的python3和pyltp的环境,但java工程是部署在docker环境里,在通过runtime调用py脚本时,实际是在docker环境下执行的,哭。

runtime方案代码:

public static String addressExtract(String setence) throws IOException, InterruptedException {
    String exe = "python3";
    String command = "common/***/models/address_extract.py"; //此处换成你自己脚本存放的相对地址
    //System.out.println(setence);

    String[] cmdArr = new String[] {exe,command,setence};
    Process process = Runtime.getRuntime().exec(cmdArr);
    InputStream is = process.getInputStream();

    BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(is));
    String line,result="";
    while ((line = bufferedReader.readLine()) !=null){
        if (line.contains("Tag:")){
            result=line.substring(4);
        }
        if (line.contains("No address!")){
            result="";
        }
        //System.out.println(line);
    }
    process.waitFor();
    return  result;
}

(2)flask框架web接口方案。

这里给flask点个大赞,真是太简单好用了(关键是简单) 。

参考:https://www.jianshu.com/p/6ac1cab17929

先通过pip3 install flask,再按照参考里边的配置一些,几行代码一个http get接口就搞定了。

本来想用uwsgi起一个服务,没搞定。还是最简单的nohup吧~

nohup python3 -u address_extract.py > out.log&

其中address_extract.py是我的接口脚本。

这样直接在java里边调接口就好啦啦啦啦啦啦啦

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值