环境:win 7 + python 3.5.2 + nltk 3.2.1
中文分词
前期准备
下载stanford-segmenter-2015-12-09(2016版的stanford segmenter与nltk接口不兼容),解压,将根目录下的stanford-segmenter-3.6.0.jar,slf4j-api.jar,data文件夹拷贝到某个文件夹下,我将它们放在了E:/stanford_jar下。
windows环境下需要修改nltk接口
将YOUR_PYTHON_PATH\Lib\site-packages\nltk\tokenize\stanford_segmenter.py第63行的
self._stanford_jar = ":".join(
修改为
self._stanford_jar = os.pathsep.join(
测试代码
from nltk.tokenize import StanfordSegmenter
if __name__ == "__main__":
segmenter = StanfordSegmenter(path_to_jar="E:/stanford_jar/stanford-segmenter-3.6.0.jar",
path_to_slf4j="E:/stanford_jar/slf4j-api.jar",
path_to_sihan_corpora_dict="E:/stanford_jar/data",
path_to_model="E:/stanford_jar/data/pku.gz",
path_to_dict="E:/stanford_jar/data/dict-chris6.ser.gz")
result = segmenter.segment("你叫什么名字")
print(result)#result是一个str,以空格分隔词
运行结果
你 叫 什么 名字
stanford segmentation运行起来很慢,个人觉得使用jieba会更好。
句法分析在分析单个词的词性的基础上,尝试分析词与词之间的关系,并用这种关系来表示句子的结构。实际上,句法结构可以分为两种,一种是短语结构,另一种是依存结构。前者按句子顺序来提取句法结构,后者则按词与词之间的句法关系来提取句子结构。
基于短语结构的剖析
前期准备
下载stanford-parser-full-2016-10-31,解压,对根目录下的stanford-parser-3.7.0-models.jar解压得到stanford-parser-3.7.0-models,进入stanford-parser-3.7.0-models\edu\stanford\nlp\models\lexparser,将chinesePCFG.ser.gz拷贝到某个文件夹下,我将它放在了E:/stanford_jar。同时,我将根目录下的stanford-parser.jar和stanford-parser-3.7.0-models.jar也放在了E:/stanford_jar
测试代码
import os
from nltk.parse import stanford
if __name__ == "__main__":
os.environ['STANFORD_PARSER'] = 'E:/stanford_jar/stanford-parser.jar'
os.environ['STANFORD_MODELS'] = 'E:/stanford_jar/'
parser = stanford.StanfordParser(model_path="E:/stanford_jar/chinesePCFG.ser.gz", encoding="gb2312")
result = parser.parse("你 叫 什么 名字".split())#parsing的句子需要先分好词
print(list(result ))
运行结果
[Tree('ROOT', [Tree('IP', [Tree('NP', [Tree('PN', ['你'])]), Tree('VP', [Tree('VV', ['叫']), Tree('NP', [Tree('DP', [Tree('DT', ['什么'])]), Tree('NP', [Tree('NN', ['名字'])])])])])])]
基于依存关系的剖析
测试代码
from nltk.parse.stanford import StanfordDependencyParser
if __name__ == "__main__":
os.environ['STANFORD_PARSER'] = 'E:/stanford_jar/stanford-parser.jar'
os.environ['STANFORD_MODELS'] = 'E:/stanford_jar/'
eng_parser = StanfordDependencyParser(model_path="E:/stanford_jar/chinesePCFG.ser.gz",encoding="gb2312")
res = list(eng_parser.parse("你 叫 什么 名字".split()))
for row in res[0].triples():
print(row)
结果
(('叫', 'VV'), 'nsubj', ('你', 'PN'))
(('叫', 'VV'), 'dobj', ('名字', 'NN'))
(('名字', 'NN'), 'det', ('什么', 'DT'))
命名实体识别是指识别句子中的人名、地名、机构名、时间、日期、货币、百分比等成分。
NER
前期准备
下载stanford-ner-2018-10-16,解压,将根目录下的stanford-ner.jar拷贝到某个文件夹下,我将它放在了E:/stanford_jar。此外,还需要下载中文模型,http://nlp.stanford.edu/software/stanford-chinese-corenlp-2018-10-05-models.jar,解压,将其中的stanford-chinese-corenlp-2018-10-05-models\edu\stanford\nlp\models\ner下的*.ser.gz 文件都拷贝到E:/stanford_jar中。
测试代码
import os
import jieba
from nltk.tag import StanfordNERTagger
if __name__ == "__main__":
os.environ['CLASSPATH'] = 'E:/stanford_jar/stanford-ner.jar'
os.environ['STANFORD_MODELS'] = 'E:/stanford_jar/'
zh_tagger = StanfordNERTagger('chinese.kbp.distsim.crf.ser.gz')
sen = list(jieba.cut("全球除中国外疫情将呈海啸般态势"))
result = zh_tagger.tag(sen)
print(result)
结果
[('全球', 'O'), ('除', 'O'), ('中国', 'GPE'), ('外', 'O'), ('疫情', 'O'), ('将', 'O'), ('呈', 'O'), ('海啸', 'O'), ('般', 'O'), ('态势', 'O')]