【NLP方向】【万时计划】0-7

【NLP】案件分级

import db_default as db
import time
import cx_Oracle
import os
import numpy as npcache
import pickle
import regex as re
import datetime
import ahocorasick
import pymysql
from elasticsearch import Elasticsearch
from elasticsearch import helpers
import cpca
import company_master_find
import suggestResult

import ahocorasick

elasticsearch

ElasticSearch:

智能搜索是分布式的搜索引擎具备搜索和分析功能。ES是分布式的集群,每个节点其实是Lucene,当用户搜索的时候会随机

img

ES优点:基于Lucene,隐藏了Lucene的复杂性,提供简单的API。ES性能比HBase高,竞价引擎存储到ES中。

  1. 分布式功能
  2. 数据高可用,集群高可用
  3. API更简单高级
  4. 支持PB级别数据
  5. 完成搜索的功能和分析功能

搜索引擎的原理:

  • 反向索引又叫做倒排索引,是根据文章内容中的关键字建立索引。
  • 搜索引擎原理就是建立反向索引。
  • Elasticsearch在Lucene的基础上进行封装,实现了分布式搜索引擎。
  • Elasticsearch中的索引、类型文档的概念比较重要,类似于mysql中的数据库、表和行。
  • Elasticsearch也是Master-slave架构,也实现了数据的分片和备份。
  • Elasticsearch一个典型的应用就是ELK日志分析系统。

ES的作用:

  1. 全文检索:类似于select * from product where product_name like ‘%牙膏%’、百度效果、电商搜索效果
  2. 结构化搜索:类似于select * from product where product_id = ‘1’
  3. 数据分析:类似于select count(*) from product

ES的核心概念:

  1. 近实时img

  2. cluster集群,ES是一个分布式的系统

    ES直接解压不需配置即可使用,在hadoop1和2上分别解压一个ES,把这两个ES启动起来,他们就构成了一个集群。

  3. node节点,即集群中的一台服务器

  4. index索引(索引库)

    使用ES把数据存进去再查询出来。ES功能类似于一个关系型数据库,ES中的索引非传统索引的含义,ES中的索引是存放数据的地方,是ES中的一个概念词汇,index类似于Mysql中的一个数据库 create database user;

  5. type类型

    类型是用来定义数据结构的,在每一个index下面,可以有一个或多个type,好比数据库里的一张表。相当于表结构的描述,描述每个字段的类型。

  6. document

    文档是最终的数据,可以认为一个文档就是一条记录,是ES里面最小的数据单元。

  7. field字段

    类似于关系型数据库中列的概念,一个document由一个或多个field组成。

  8. shard分片

    一台服务器无法存储大量数据,ES把一个index里面的数据,分成多个shard,分布式地存储在各个服务器上。kafka支持分布式功能是因为里面有topic,支持分区的概念。所以topicA可以存在不同的节点上,即可支持海量数据和高并发,提升性能和吞吐量。

  9. replica副本

    保证数据安全,在ES集群中,一摸一样的数据有多份,能正常提供查询和插入的分片叫做primary shard其余叫做replica shard

    当我们去查询数据的时候,数据是有备份的,它会同时发出命令让有数据的机器去查询结果,最后谁的结果快,就要谁的数据

    拥有相同数据的分片是不会在同一个节点上的,当只有一个节点时,分片不会把仅有的副本存在该节点上,当新加入了一台节点,ES会自动在新机器上创建一个之前分片的副本。

cpca

用于提取简体中文字符串中省市区并进行映射,检验和简单绘图的python模块

“徐汇区虹漕路461号58号楼5楼”, “泉州市洛江区万安塘西工业区”
↓ 转换
|省 |市 |区 |地址 |
|上海市|上海市|徐汇区|虹漕路461号58号楼5楼 |
|福建省|泉州市|洛江区|万安塘西工业区 |

也可以将大段文本中所有提到的地址提取出来,并自动将相邻的存在所属关系的地址归并到一条记录中。

模块中最主要的方法是cpca.transform,该方法可以输入任意可迭代类型(list、pandas的Series类型等),然后将其转换为一个dataFrame

location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "北京朝阳区北苑华贸城"]
import cpca
df = cpca.transform(location_str)
print(df)
#程序输出的是一个pandas的DataFrame类型变量,DateFrame可以非常轻易地转化为csv或excel文件

   省     市    区          地址              adcode
0 上海市 上海市  徐汇区     虹漕路46158号楼5310104
1 福建省 泉州市  洛江区     万安塘西工业区        350504
2 北京市 市辖区  朝阳区     北苑华贸城           110105

如果想要获知程序是从字符串哪个位置提取出省市区名的,可以添加一个pos_sensitive=Ture参数:

location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "北京朝阳区北苑华贸城"]
import cpca
df = cpca.transform(location_str, pos_sensitive=True)
print(df)
     省    市    区        地址               adcode    省_pos  市_pos 区_pos
0  上海市  上海市  徐汇区  虹漕路461号58号楼5楼   310104     -1     -1      0
1  福建省  泉州市  洛江区  万安塘西工业区         350504     -1      0      3
2  北京市  市辖区  朝阳区  北苑华贸城            110105     -1     -1      0

其中省_pos 、市_pos 、区_pos此三列大于-1的部分代表提取的位置,-1表示此字段是靠程序推断出来的,或者没能提取出来。
有的时候为了方便concat,想要自定义输出表的index,可以选择使用transform函数的index参数(此参数只要保证长度和data相同即可,可以是list或者pandas中相关的类型)

从大段文本中提取多个地址

import cpca
df = cpca.transform_text_with_addrs("分店位于徐汇区虹漕路461号58号楼5楼和泉州市洛江区万安塘西工业区以及南京鼓楼区")
print(df)
#注意 transform_text_with_addrs 获得的数据,“地址”列都是空的
#transform_text_with_addrs还支持和transform类似的index,pos_sensitive以及umap参数
    省     市     区    地址   adcode
0  上海市  市辖区  徐汇区       310104
1  福建省  泉州市  洛江区       350504
2  江苏省  南京市  鼓楼区       320106
regex

正则表达式,Regular Expression。正则表达式用单个字符串来描述、匹配一系列符合某个句法规则的字符串。分为:普通正则表达式、扩展正则表达式、高级正则表达式。普通正则表达式在linux shell中常用到,高级正则表达式语法规范基本由perl演化而来。

正则表达式字符串格式:一般正则表达式由普通字符+特殊字符(元字符)一起组成的字符串。如:匹配“ab开头,后面紧跟数字的字符串”==“ab\d+”其中ab即普通字符,\d代表0-9数字,+代表前面字符出现1次以上

字符描述
\将下一字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如’n’匹配字符"n"。‘\n’匹配一个换行符。序列’\'匹配"“而”\(“则匹配”("
^匹配输入字符串的开始位置,如果设置了RegExp对象的Multiline属性,^也匹配’\n’或’\r’之后的位置
$匹配输入字符串的结束位置。如果设置了RegExp对象的multiline属性,$也匹配’\n’或’\r’之前的位置。
*匹配前面的子表达式零次或者多次。如,zo*能匹配"z"以及"zoo"。 * 等价于{0,}
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+‘。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m和n均为非负数,n<=m最少匹配 n 次且最多匹配 m 次。刘, “o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?'。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从matches集合得到,在VBScript中使用SubMatches集合,在JScript中使用 $0… 9属性。要匹配圆括号字符,适用“或”
(?:pattern)匹配pattern但不获取匹配结果,即非获取匹配,不进行存储供以后使用。这在使用“或”字符(|)来组合一个模式的各个部分是很有用的。例如 industr(?:y|ies)就是一个比’industry|industries’更简略的表达式。
(?=pattern)正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。预查不消耗字符,即在一个匹配发生后立即开始下一次匹配的搜索,而非从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
x|y
[xyz]字符集合。匹配所包含的任意一个字符[abc]匹配plain中的a
[^xyz]负值字符集合。匹配未包含的任意字符。
[a-z]字符范围。匹配指定范围内的任意字符。[a-z]可以匹配a到z范围内任意小写字母字符
[^a-z]
\b匹配一个单词边界,即指单词和空格之间的位置。'er\b’可以匹配到never中的er,但不能匹配verb中的er
\B匹配非单词边界er\B能匹配verb中的er,但不能匹配never中的er
\cx匹配由x指明的控制字符。如\cM匹配一个control-M或回车符。x的值必为A-Z或a-z之一否则,将c视为一个一个原义字符’c’
\d匹配一个数字字符。等价于[0-9]
\D匹配一个非数字字符
\f匹配一个换页符。等价于\x0c和\cL
\n匹配一个换行符。等价于\x0a和\cJ
\r匹配一个回车符。等价于\x0b和\cM
\s匹配任何空白字符,包括空格、制表符、换页符等
\S匹配任何非空白字符
\t匹配一个制表符,等价于\x09和\cl
\v匹配一个垂直制表符。等价于\x0b和\cK
\w匹配包括下划线的任何单词字符。等价于’A-Za-z0-9’
\W匹配任何非单词字符
\xn匹配其中n为十六进制转义值。十六进转义值必须为确定的两个数字长。例如’\x41’匹配"A"
\num匹配num,其中num是一个正整数。对所获取的匹配的引用。如’(.)\1’匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7)则n为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7)则匹配八进制转义值nml。
\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。

一、如果要匹配一个手机号

  1. 分析字符串特点,以1开头的11位数字
  2. “1\d”,1开头,后面跟着数字也可以是。。。
  3. 数字长11位,补充1\d{10}括号中的数字表示它左边字符可以出现的次数
  4. 所有字符必须是11位,因此头尾直接必须满足条件,因此可以是:^1\d{10}$了。

二、匹配QQ号码

  1. 5位到11位
  2. 定义首位字符[1-9]\d首位字符是1-9,后面是字符
  3. 后面字符个数在4-10位[1-9]\d{4,10}
  4. 1\d{4,10}$
re.match

re.match(pattern,string,flags=0)从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none.

pattern:正则表达式;string:待匹配的字符串;flags:修饰符,匹配模式(re.S表示匹配换行符,re.l表示对大小写不敏感)

返回结果的方法:result.group(num=0):匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

re.sub

re.sub(pattern,repl,string,count=0,flags=0)替换字符串中每一个匹配的子串后返回替换后的字符串(pattern是正则表达式,repl是替换成的字符串,也可为一个函数对匹配值的操作,string是查找的字符串,count是模式i匹配后替换的最大次数,默认0表示替换所有匹配)

总结:完成python环境配置及pycharm安装。开始阅读代码从起始文件开始理解跳转到db_default.py文件理解mysql数据库连接功能。查询并理解cx_Oracle模块的使用方法。理解程序中断后继续搜索采用的机制,搜索cpca库的使用教程理解当事人地址补全提取的原理。理解可供执行案件的筛选原理,对失信人相关的案件进行清洗机制。


  1. 1-9 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值