记一次曲折的使用经历。。
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.youkuaiyun.com/qq_36213262/article/details/89373268
PS:mac安装的时候会遇到各种7788的问题,请参考下面这篇文章,很管用。
mac 安装pyltp:
https://blog.youkuaiyun.com/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里边调接口就好啦啦啦啦啦啦啦