https://github.com/huangcongqing/query_analysis
自然语言处理(NLP) 语句抽取
https://github.com/huangcongqing/query_analysis
nlp python2 python27
Last synced: 7 months ago
JSON representation
自然语言处理(NLP) 语句抽取
- Host: GitHub
- URL: https://github.com/huangcongqing/query_analysis
- Owner: HuangCongQing
- License: mit
- Created: 2018-04-22T10:37:56.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2018-05-27T13:23:40.000Z (almost 8 years ago)
- Last Synced: 2024-10-13T13:04:10.583Z (over 1 year ago)
- Topics: nlp, python2, python27
- Language: Python
- Homepage:
- Size: 173 KB
- Stars: 3
- Watchers: 3
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# QueryAnalysis(python2X),不是python3X
Changed by [ChungKing](https://github.com/HuangCongQing/query_analysis)
当前业界文本语义信息抽取基本是使用正则表达式来完成的,正则表达式本身并不提供管理与测试功能。
在进行基于正则的文本语义抽取的时候,还需要做大量的基础工作,来便于编写、管理和测试正则表达式。
本项目提供大量底层与框架支持,便于使用者方便的编写,管理与测试大批量的正则表达式,以支持高效稳定的语义抽取服务。
### 项目初始化
```
pip install -r requirements
python main.py
```
### ERROR
* [UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 11: illegal multibyte sequence](https://github.com/HuangCongQing/query_analysis/issues/1)
## 本项目由3块组成 ##
* 1.词典(用于组织需要被正则模板使用的底层词库)
* 2.正则语义模板(根据不同业务编写的一组正则表达式)
* 3.框架与lib包(用于加载正则表达式完成对输入文本的语义抽取)
## 1.词典模块 ##
词典模块位于dict目录
对于需要公共使用的词典放到common目录里,其它各语义需要使用的词典放到各自的目录中
词典模块中的词典文件使用csv文件格式
词典内容支持多列形式,支持对词典中每个词添加一个或多个属性(词典中用,分隔)
对于写成的词典需要在/dict/dict.py中加载上来,供正则模板使用
方法如下:
方法一:加载不带属性
> stop_words = WordsDict(
> './dict/common/stop_words.csv')
方法二:加载带属性的字典(字典中用逗号分隔的)
> animal_name = WordsDict(
> './dict/animal/animal.csv',
> property_name_list=['arid'],
> group_name='animal')
property_name_list参数,指定逗号分隔,依次第n个参数返回时的字段名
group_name参数,指定被命中的信息,在字典中返回的key名
如:我要看老虎,这句老虎在字典中定义如下:
>老虎,1
>被正则命中后取得的返回结果中就会包含如下信息:
>{'arid': '1', 'animal': '老虎'}
## 2.正则语义模板 ##
正则语义模板位于/nlu目录
media目录是指用于需播放的信息,如相声,戏曲,动画,故事等,这类播放结构较为类似,故放在同一目录下
使用/nlu/media/common提取公共部分,在各模块内部只完成各自不同的信息即可。
smart目录下是指智能硬件的模块。
在/nlu目录下的其它模块,每个模块均代表1种语义
每个正则语义模块下有2个需要添加的内容:
1.service属性,这个属性指明这个类是代表什么语义的,在输入文本命中本类中包含的正则语义后,
返回的信息里会包含这个service属性。
2.nlu.rule.Rule对象,这个对象中包含的正则表达式信息,框架会用来对输入文本进行匹配。
## 3.框架与lib包 ##
当包含有正则表达式的语义类完成之后,需要把这个类注册到框架中去,方法如下:
> import nlu.animal as animal
> from nlu.nlu_framework import Nlu_Framework
> Nlu_Framework.register(animal.Animal)
这样框架就可以用Animal类里的Rule对象所指定的正则变量来处理输入文本了
使用框架匹配正则模块如下:
> match_dict_list = Nlu_Framework.match('我想看老虎')
> print match_dict_list[0].items()
输出如下:
> [('operation', 'query'), ('service', 'animal'),
> ('parameters', {'arid': '1', 'rule': '5', 'animal': '\xe8\x80\x81\xe8\x99\x8e'})]
lib包里提供了一些在完成正则语义编写常用的函数
> attach_name函数:对指定正则附加一个名字属性,当命中这个正则时会返回这个属性
> attach_perperty函数:对指定的正则表达式附加一个属性,当命中此正则时返回这个属性
> e函数:表示正则里的可出现也可不出现(({})?)
> o函数:表示正则里的或条件(({a|b}))
> r函数:表示正则里的重复
#Docker支持#
本项目支持在docker容器中运行
方法1(自制镜象):
* 1.进入本目录
* 2.docker build -t query_analysis .
* 3.docker run --rm --name query_analysis --net=host hub.c.163.com/yufeiok/query_analysis
方法2(直接下载镜象):
* 1.docker pull hub.c.163.com/yufeiok/query_analysis:latest
* 2.docker run --rm --name query_analysis --net=host hub.c.163.com/yufeiok/query_analysis
* 3.curl '127.0.0.1:8700/interpreter/info?speech=%E6%88%91%E8%A6%81%E7%9C%8B%E8%80%81%E8%99%8E&robot_code=0'(测试)
这就可以直接在本机的8700端口进行测试了,返回结果如下:
curl '127.0.0.1:8700/interpreter/info?speech=%E6%88%91%E8%A6%81%E7%9C%8B%E8%80%81%E8%99%8E&robot_code=0' (发送文本:我要看老虎)
返回结果:
{"msg": "OK", "body": {"operation": "query", "service": "animal", "parameters": {"arid": "1", "rule": "5", "animal": "\u8001\u864e"}}, "code": 0}
#使用方法#
* 1.编写用于提取语义的类,如下所示:
> usage.py
> class Test(object):
> # 标识是test领域(这个service字段必须存在,命中本类中正则时,会输出这个字段)
> service = 'test'
> # 表示抓取2个字长度的信息,输出字段为name
> name = range_tag(2, 'user_name')
> # 正则规则:我的名字是小明
> name_case1 = '我的名字是' + name
> # 生成规则对象(附加的参数会在输出结果中被输出,operation代表具体的操作)
> rule_case1 = Rule(attach_perperty(name_case1, {'operation': 'query', 'rule': 1}))
* 2.把本类注册到NLU框架中
> from nlu.nlu_framework import Nlu_Framework
> Nlu_Framework.register(Test)
* 3.使用规则来处理输入文本
> match_dict_list = Nlu_Framework.match('我的名字是小明')
> for k, v in match_dict_list[0].items():
> print '{} : {}'.format(k, v)
* 4.输出结果如下:
> operation : query
> service : test
> parameters : {'user_name': '\xe5\xb0\x8f\xe6\x98\x8e', 'rule': '1'}