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下载

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

  1. 统计单词频率 java_java 统计一个(英文)文本中频率最高的10个单词

    要求: 统计一个(英文)文本中频率最高的10个单词 解决思路:1.通过java I/O操作读取文本文件 2.用BufferedReader每次读取文本的一行(即为一个String) 3.将取得的Str ...

  2. python将数字拆分_Python 整数拆分

    问题描述: 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = ...

  3. python groupby用法_Python 标准库实践之合并字典组成的列表

    作者 | 陈祥安 来源 | Python学习开发 最近做了个数据合并的需求这里记录下: 要求如下: dict_of_list1 = [{"name": "zhangsan ...

  4. python布尔系列_python – 获取pandas布尔系列为True的索引列表

    使用 Boolean Indexing >>> s = pd.Series([True, False, True, True, False, False, False, True]) ...

  5. 用python画长方形_Python+opencv:绘制矩形,编写文本,PythonOpenCV,画,矩形框

    #用 OpenCV 标注 bounding box主要用到下面两个工具--cv2.rectangle() 和 cv2.putText().用法如下: # cv2.rectangle() # 输入参数分 ...

  6. python常胜将军问题_Python中最常见的10个问题(列表)

    列表是Python中使用最多的一种数据结果,如何高效操作列表是提高代码运行效率的关键,这篇文章列出了10个常用的列表操作,希望对你有帮助. 1.迭代列表时如何访问列表下标索引 普通版: items = ...

  7. python判断数字_python判断变量是否为数字、字符串、列表、字典等

    在实际写程序中,经常要对变量类型进行判断,除了用type(变量)这种方法外,还可以用isinstance方法判断: a = [1,2] if 'list' in str(type(a)): print ...

  8. python 列表拆分_python列表拆分

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我对python很新,但我遇到了问题. 我有一个看起来像列表的文本文件. 例如: ...

  9. 教你Python字符串的基本操作:拆分和连接

    摘要:由于字符串数据几乎无处不在,因此掌握有关字符串的交易工具非常重要.幸运的是,Python 使字符串操作变得非常简单,尤其是与其他语言甚至旧版本的 Python 相比时. 本文分享自华为云社区&l ...

最新文章

  1. 第三周项目四-穷举法解决组合问题
  2. python【蓝桥杯vip练习题库】ALGO-232找零钱(贪心 模拟)
  3. monty python喜剧-Monty Python(蒙提·派森)的成员简介
  4. Android--解析XML之PULL
  5. Ubuntu下安装Docker
  6. LTM设备上ping不通网关
  7. C/Cpp / STL / 模板全特化和偏特化
  8. Greenplum【环境搭建 02】GP 数据库 web 监控工具 Greenplum Command Center v6.6.0 安装配置及问题处理(一篇学会部署配置启动 GPCC 避坑指南)
  9. shell 与 空格
  10. Linux shell script 的语法汇总
  11. 初识Python 04 day
  12. linux 安装apache resin,Linux下安装resin+apache+jdk+php+mysql(gd)全过程(二)
  13. android音乐播放器开发思路,手把手教你做音乐播放器(一)功能规划
  14. 解决ps图层不能填充问题
  15. 白帽SEO与黑帽SEO的区别
  16. 非常好用且快速的Youtube下载命令行工具yt-dlp
  17. 移动端那些事儿(二)jquery手势插件之jGestures
  18. java Excel导入导出工具类 及使用demo
  19. 一键重装系统后电脑黑屏怎么办,电脑系统重装黑屏
  20. go使用交叉编译时,二进制文件运行不了,出现line 1: syntax error: unexpected newline

热门文章

  1. Java 简单计时器
  2. 计算机毕设旅游网的开发,计算机毕业设计分享Jsp旅游直通车服务系统
  3. 国内IT外企的工资水平
  4. 计算机软件作品策划书,2013年江西师范大学软件学院计算机作品大赛策划书(修改版)...
  5. 再见,区块链 Rio会议和以太坊Sao Paolo活动。 你好,闪光时刻
  6. NSX-T 系列:第 8部分 - 添加Edge节点和配置Edge集群
  7. ImageJ批量将大图分割为多个小图并分别保存
  8. 如何搞定不同公司的算法面试?(早早聊分享文字版)
  9. Python+selenium+Chromedriver+代理爬取Google图片
  10. 035-JAVA语言实现下拉菜单与弹出菜单功能