在windows x64上安装CRFPP并进行地址识别【亲测有效】--python自然语言处理实战

2 篇文章 0 订阅

安装CRFPP

  1. 在百度网盘上下载CRF+±0.58

    链接:点这里

    提取码:peub

在这里插入图片描述

  1. 在windows x64上安装,需要在\CRF+±0.58\python\中,运行下面两个语句

    python  setup.py build
    python setup.py install
    

在这里插入图片描述

说明:python setup.py install 有可能会遇到权限不足的问题, 需要换成管理员模式安装

  1. 验证是否安装成功,如果导入后没有报错,则安装成功

在这里插入图片描述

模型训练及预测

  1. 在DOS里,进入CRF+±0.58文件路径里,输入如下语句,进行模型训练

    # 训练
    crf_learn -f 4 -p 8 -c 3 ../data/template ../data/train.txt ../result/model
    

在这里插入图片描述

数据集及模板点这里下载
百度网盘提取码:8jlu

  1. 预测时,输入如下语句

    # 预测
    crf_test -m ../result/model ../data/test.txt > ../result/test.rst
    
  2. 可以使用如下代码计算模型在测试集上的效果

    def cal_f1(path):
        with open(path, encoding='utf8') as f:
            all_tag = 0  # 记录所有的标记数
            loc_tag = 0  # 记录真实的地理位置标记数
            pred_loc_tag = 0  # 记录预测的地理位置标记数
            correct_tag = 0  # 记录正确的标记数
            correct_loc_tag = 0  # 记录正确的地理位置标记数
    
            states = ['B', 'M', 'E', 'S']
            for line in f:
                line = line.strip()
                if line == '': continue
                _, r, p = line.split()
                all_tag += 1
                if r == p:
                    correct_tag += 1
                    if r in states:
                        correct_loc_tag += 1
                if r in states:
                    loc_tag += 1
                if p in states:
                    pred_loc_tag += 1
            loc_P = 1.0 * correct_loc_tag / pred_loc_tag
            loc_R = 1.0 * correct_loc_tag / loc_tag
            loc_f1 = (2 * loc_P * loc_R) / (loc_P + loc_R)
            print('loc_P:{0}, loc_R:{1}, loc_F1:{2}'.format(loc_P, loc_R, loc_f1))
            
    if __name__ == '__main__':
        cal_f1('./result/test.rst')
    

    运行结果如下
    在这里插入图片描述

模型使用

用CRF++实现地址识别,具体代码如下

  • load_model():用于加载之前训练的模型
  • locationNER():接收字符串,输出其识别出的地名
def load_model(path):
    import os, CRFPP
    # -v 3:access deep information like alpha,beta,prob
    # -nN: enable nbest output. N should be >=2
    if os.path.exists(path):
        return CRFPP.Tagger('-m {0} -v 3 -n2'.format(path))


def locationNER(text):
    tagger = load_model('./result/model')
    for c in text:
        tagger.add(c)
    result = []
    # parse and changes internal stated as 'parsed'
    tagger.parse()
    word = ''
    for i in range(0, tagger.size()):
        for j in range(0, tagger.xsize()):
            ch = tagger.x(i, j)
            tag = tagger.y2(i)
            if tag == 'B':
                word = ch
            elif tag == 'M':
                word += ch
            elif tag == 'E':
                word += ch
                result.append(word)
            elif tag == 'S':
                word = ch
                result.append(word)
    return result

if __name__ == '__main__':
    text = '我中午要去北京饭店,下午去中山公园,晚上回亚运村。'
    print(text, locationNER(text), sep='==>')

    text = '我去回龙观,不去南锣鼓巷'
    print(text, locationNER(text), sep='==>')

    text = '打的去北京南路'
    print(text, locationNER(text), sep='==>')

运行结果如下

在这里插入图片描述
如果本文对你有帮助,记得“点赞”哦~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值