Python之文本分析(附搜索引擎)

python字符串的相关操作,这是非常基础的知识,但却是使用频度非常高的一些功能。
正则表达式是处理字符串的强大工具,拥有独特的语法和独立的处理引擎。
我们在大文本中匹配字符串时,有些情况用str自带的函数(比如find, in)可能可以完成,有些情况会稍稍复杂一些(比如说找出所有“像邮箱”的字符串,所有和julyedu相关的句子),这个时候我们需要一个某种模式的工具,这个时候正则表达式就派上用场了。

和拉丁语系不同,亚洲语言是不用空格分开每个有意义的词的。而当我们进行自然语言处理的时候,大部分情况下,词汇是我们对句子和文章理解的基础,因此需要一个工具去把完整的文本中分解成粒度更细的词。

 字符串的操作

(这里仅提供统计字符串中出现频次最多的字母统计进行源码公开,部分刚转行的需要字符串基础部分的源码,可关注微信公众号,私信小编,将私发给你)

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 23 15:36:34 2018

@author: 雍珑庚
"""

#==========================================================
# 统计字符串中出现频次最多的字母
#==========================================================
#方法一
import re
from collections import Counter

def get_max_value_v1(text):
    text = text.lower()
    result = re.findall('[a-zA-Z]', text)  # 去掉列表中的符号符
    count = Counter(result)  # Counter({'l': 3, 'o': 2, 'd': 1, 'h': 1, 'r': 1, 'e': 1, 'w': 1})
    count_list = list(count.values())
    max_value = max(count_list)
    max_list = []
    for k, v in count.items():
        if v == max_value:
            max_list.append(k)
    max_list = sorted(max_list)
    return max_list[0]

#方法2
def get_max_value_v2(text):
    count = Counter([x for x in text.lower() if x.isalpha()])
    m = max(count.values())
    return sorted([x for (x, y) in count.items() if y == m])[0]
#方法3
import string

def get_max_value(text):
    text = text.lower()
    return max(string.ascii_lowercase, key=text.count)

正则表达式

语法

废话少说,直接上技能
当你要匹配 一个/多个/任意个 数字/字母/非数字/非字母/某几个字符/任意字符,想要 贪婪/非贪婪 匹配,想要捕获匹配出来的 第一个/所有 内容的时候,记得这里有个小手册供你参考。

 验证工具

我最喜爱的正则表达式在线验证工具之一是http://regexr.com/
谁用谁知道,用过一次以后欲罢不能,跟刷抖音似的,越来越上瘾。

 挑战与提升

对于想练习正则表达式,或者短期内快速get复杂技能,or想挑战更复杂的正则表达式的同行们。 请继续跟我开车

案例分析

re模块

使用步骤:

  • 将正则表达式的字符串形式编译为pattern实例
  • 使用pattern实例处理文本并获得匹配结果
  • 使用match实例获得信息,进行其他的操作
# encoding: UTF-8
import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello.*\!')

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello, yonglonggeng! How are you?')

if match:
    # 使用Match获得分组信息
    print match.group()
match模块

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用 
Match提供的可读属性或方法来获取这些信息。

import re
m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello yonglonggeng! I’m in Beijing')

print "m.string:", m.string   # 匹配时使用的文本。
print "m.re:", m.re # 匹配时使用的Pattern对象
print "m.pos:", m.pos   # 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
print "m.endpos:", m.endpos # 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
print "m.lastindex:", m.lastindex   # 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
print "m.lastgroup:", m.lastgroup   # 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

print "m.group(1,2):", m.group(1, 2)    # 获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。
print "m.groups():", m.groups() # 以元组形式返回全部分组截获的字符串。
print "m.groupdict():", m.groupdict()   # 返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。
print "m.start(2):", m.start(2) # 返回指定的组截获的子串在string中的起始索引
print "m.end(2):", m.end(2) # 返回指定的组截获的子串在string中的结束索引
print "m.span(2):", m.span(2)       # 返回(start(group), end(group))
print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')    # 将匹配到的分组代入template中然后返回。template中可以使用\id或\g、\g引用分组,但不能使用编号0。
pattern模块

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。

[注意] Pattern不能直接实例化,必须使用re.compile()进行构造。

import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)

print "p.pattern:", p.pattern
print "p.flags:", p.flags
print "p.groups:", p.groups
print "p.groupindex:", p.groupindex

jieba中文处理

基本分析函数

jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使
for 循环来获得分词后得到的每一个词语(unicode)

# encoding=utf-8
import jieba

seg_list = jieba.cut("我在学习自然语言处理", cut_all=True)
print seg_list
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我在学习自然语言处理", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("我毕业于骊山男子学院,曾经是一个挖煤的,现在是搞科技的")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("珑哥毕业西安一所普通的大学,后在不甘心高考专业问题,偷偷学习自己感兴趣的")  # 搜索引擎模式
print(", ".join(seg_list))
# jieba.lcut以及jieba.lcut_for_search直接返回 list
result_lcut = jieba.lcut("珑哥毕业西安一所普通的大学,后在不甘心高考专业问题,偷偷学习自己感兴趣的")
print result_lcut
print " ".join(result_lcut)
print " ".join(jieba.lcut_for_search("珑哥毕业西安一所普通的大学,后在不甘心高考专业问题,偷偷学习自己感兴趣的"))
# 很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))
jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))

明日推文:

关键字提取,词性标注,并行分词,Tokenize:返回词语在原文的起止位置
,ChineseAnalyzer for Whoosh搜索引擎,命令行分词,

获取完整代码,后台私信小编.

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值