NLTK+LTP进行中文处理

安装NLTK

NLTK是一个NLP工作平台,可以和一些NLP库配合使用。

激活虚拟环境,因为原本已经安装了 pyltp ,不想再开新的环境了…

继续安装:

1
2
3
4
pip install numpy
conda install scipy
pip install Tornado
pip install nltk

前两个是高性能数学计算软件包,第三个是网络包

作为一个非洲人,果然安装nltk的过程并不顺利

报错信息:

1
2
Could not find a version that satisfies the requirement nltk (from versions: )
No matching distribution found for nltk

切换成 conda 命令,居然好了…本非颇为不适

在pycharm新建一个项目,指定解释器,新建py文件,执行如下代码:

1
2
3
4
5
6
7
import sys
import os
import nltk
from importlib import reload

reload(sys)
nltk.download()

然后出现了 WinError10060错误 ,血统纯正。

只能手动下数据包了,git地址

后面的过程老是导入出错,卡了好久,把网上所有的方法试了一遍,最后居然是因为。。没有重启pycharm试试,之前一直在解释器中运行的,后来用脚本就可以了。也不知道是重启还是脚本的原因,反正数据本身是没有问题的,如果导入出错,一定是路径设置的不对!

把packages中的文件解压,文件件重命名为nltk_data , 放在C 盘根目录下…是的,就是这么粗暴…

设置用户变量NLTK_DATA C:\nltk_data

运行脚本

1
2
3
import nltk
nltk.data.find('C:\\') # 设置路径
from nltk.book import *

解决方法参考


导入LTP语言处理模型

之前已经安装过pyltp自然语言处理库, 这里只需要导入模型。 安装可参看之前写的

ltp模型 下载v3.4.0.zip版本, 在KGQA目录下,修改ltp.py里的ltp模型文件的存放目录

分词

实现用的是CRF模型

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
import os
from importlib import reload
from pyltp import Segmentor

reload(sys)
model_path = "C:\\Users\\18771\\Desktop\\data\\ltp_data_v3.4.0\\cws.model"

segmentor = Segmentor() # 实例化分词模块
segmentor.load(model_path) # 加载分词库

words = segmentor.segment("晚秋的哀牢山宛如一个成熟的睡美人,轻柔的晨风从身边掠过,拂遍林海奇峰,挽起霞霭,任南迁的候鸟洗礼,猿啸与松涛齐鸣,青山共斜阳万里。")

print("|".join(words))

输出结果

1
晚秋|的|哀牢山|宛如|一个|成熟|的|睡美人|,|轻柔|的|晨风|从|身边|掠过|,|拂|遍|林海|奇峰|,|挽|起|霞霭|,|任|南迁|的|候鸟|洗礼|,|猿啸|与|松涛|齐鸣|,|青山|共|斜阳|万|里|。
词性标注及命名实体识别

词性标注依旧用的是CRF算法,遵从北大词性标注规范。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import os
from importlib import reload
from pyltp import *

reload(sys)

sent = "晚秋|的|哀牢山|宛如|一个|成熟|的|睡美人|,|轻柔|的|晨风|从|身边|掠过|,|拂|遍|林海|奇峰|,|挽|起|霞霭|,|任|南迁|的|候鸟|洗礼|,|猿啸|与|松涛|齐鸣|,|青山|共|斜阳|万|里|。"
model_path = "C:\\Users\\18771\\Desktop\\data\\ltp_data_v3.4.0\\pos.model"
model_path2 = "C:\\Users\\18771\\Desktop\\data\\ltp_data_v3.4.0\\ner.model"
words = sent.split("|")

postagger = Postagger() # 实例化词性标注类
postagger.load(model_path)
postags = postagger.postag(words)

recongnizer = NamedEntityRecognizer() # 实例化命名实体识别类
recongnizer.load(model_path2)
netags = recongnizer.recognize(words,postags)

for word,postag,netag in zip(words,postags,netags):
print(word+"/"+postag + "/" + netag)

识别出:

1
哀牢山/ns/S-Ns
依存句法树

结合使用NLTK和LTP可以构造依存句法树

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys
import os
from importlib import reload
from pyltp import *
import nltk
from nltk.tree import Tree # 导入nltk tree
from nltk.grammar import DependencyGrammar # 导入依存句法包
from nltk.parse import *
import re

reload(sys)

words = "苏州 的 拙政园 是 旅游胜地 。".split(" ")

model_path = "C:\\Users\\18771\\Desktop\\data\\ltp_data_v3.4.0\\pos.model"
model_path2 = "C:\\Users\\18771\\Desktop\\data\\ltp_data_v3.4.0\\parser.model"

postagger = Postagger() # 实例化词性标注类
postagger.load(model_path)
postags = postagger.postag(words)

parser = Parser() # 将词性标注和分词结果都加入分析器进行句法解析
parser.load(model_path2)
arcs = parser.parse(words,postags)
arclen = len(arcs)
conll = ""
for i in range(arclen): # 构建conll标准数据结构
if arcs[i].head == 0:
arcs[i].relation = 'ROOT'
conll += "\t" + words[i] + "(" + postags[i] + ")" + "\t" + postags[i] + "\t" + str(arcs[i].head) + "\t" + arcs[i].relation + "\n"
print(conll)
conlltree = DependencyGraph(conll) # 转换为依存句法图
tree = conlltree.tree() # 构建树结构
tree.draw() # 显示输出的树

会在NLTK中输出一个依存树的图,我就不贴图了。。不会传图。。