热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python单词拆分_python如何拆分没有空格的文本为单词列表?将组合单词拆分开...

python-如何拆分没有空格的文本为单词列表?将组合单词拆分开很多时候,我们需要把一长串单词字符拆分开来,比如:输入&#x

python - 如何拆分没有空格的文本为单词列表?将组合单词拆分开

很多时候,我们需要把一长串单词字符拆分开来,比如:

输入:“tableapplechairtablecupboard …”很多字。我们希望有一个有效的算法来分割这样的文本到单词列表,并得到:

输出:[“table”,“apple”,“chair”,“table”,“cup”,“board”]

或者将一个很长的函数名拆分成小单词: WbxNewBrowserInstance 变为 [ wbx new browser instance ]

1算法的思想

算法的思想是:通过所有可能的单词(从第一个字母开始),并找到最长的单词可能 ,插入空格。

所以我们需要一个 “常用单词列表”。

后面的方法是对输出的分布进行建模。良好的第一近似是假设所有单词是独立分布的。然后你只需要知道所有单词的相对频率。可以合理地假定它们遵循Zipf定律,即在单词列表中具有秩n的单词具有大约1 /(n log N)的概率,其中N是字典中的单词数。

一旦你修正了模型,你可以使用动态规划来推断空格的位置。最可能的句子是最大化每个单词的概率的乘积,并且很容易用动态规划来计算它。不是直接使用概率,而是使用定义为概率的倒数的对数的成本来避免溢出。

2代码

def cutLongNameFun(self,s):

''' longWords变为 long word:log里面有很多长函数名,比如WbxMeeting_VerifyMeetingIsExist。 将其拆成小单词wbx meeting verify meeting is exist,更有意义。若有大写则分割。 '''

# Build a cost dictionary, assuming Zipf's law and cost = -math.log(probability).

# 建立一个成本字典,假设Zipf定律和成本= -math.log(概率)。

words = open("words-by-frequency.txt").read().split() # 有特殊字符的话直接在其中添加

wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words))

maxword = max(len(x) for x in words)

def infer_spaces(s):

'''Uses dynamic programming to infer the location of spaces in a string without spaces. .使用动态编程来推断不带空格的字符串中空格的位置。'''

# Find the best match for the i first characters, assuming cost has

# been built for the i-1 first characters.

# Returns a pair (match_cost, match_length).

def best_match(i):

candidates = enumerate(reversed(cost[max(0, i-maxword):i]))

return min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates)

# Build the cost array.

cost = [0]

for i in range(1,len(s)+1):

c,k = best_match(i)

cost.append(c)

# Backtrack to recover the minimal-cost string.

out = []

i = len(s)

while i>0:

c,k = best_match(i)

assert c == cost[i]

out.append(s[i-k:i])

i -= k

return " ".join(reversed(out))

使用实例:

s = 'thumbgreenappleactiveassignmentweeklymetaphor'

print(infer_spaces(s))

# 结果为 thumb green apple active assignment weekly metaphor.

Before: thereismassesoftextinformationofpeoplescommentswhichisparsedfromhtmlbuttherearen

odelimitedcharactersinthemforexamplethumbgreenappleactiveassignmentweeklymetapho

rapparentlytherearethumbgreenappleetcinthestringialsohavealargedictionarytoquery

whetherthewordisreasonablesowhatsthefastestwayofextractionthxalot.

After: there is masses of text information of peoples comments which is parsed from html but there are no delimited characters in them for example thumb green apple active assignment weekly metaphor apparently there are thumb green apple etc in the string i also have a large dictionary to query whether the word is reasonable so what s the fastest way of extraction thx a lot.

正如你可以看到,这个算法基本上是完美的。最重要的部分是确保你的单词列表训练到一个类似于你实际遇到的语料库,否则结果将是非常糟糕。所以你应该手工完善自己的单词库。

3下载



推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
宠医_臻爱一生_156
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有