概述
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 13'):", m.expand(r'2 13') # 将匹配到的分组代入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搜索引擎,命令行分词,
获取完整代码,后台私信小编.
最后
以上就是痴情巨人为你收集整理的Python之文本分析(附搜索引擎)的全部内容,希望文章能够帮你解决Python之文本分析(附搜索引擎)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复