【问题标题】:Tokenizing unsplit workds using NLTK/Python3使用 NLTK/Python3 对未拆分的工作进行标记
【发布时间】:2017-10-05 04:28:30
【问题描述】:

我有未拆分的单词,例如PageMetadataServiceConsumerPowerSellerUpdateConsumerApplicationMetaDataDomain 等。这些单词没有任何标点符号或动词。但是当我们看到这个词时,我们就知道它们是由什么组成的。

有没有办法使用 nltkPowerSellerUpdateConsumerApplication 拆分为 PowerSellerUpdateConsumerApplication

【问题讨论】:

  • 解决方案对您有用吗?

标签: regex python-3.x nltk


【解决方案1】:

您可以尝试以下方法:

这个想法是在大写字符的左侧附加一个分隔符字符串(在下面的字符串中是###)......如果你以某种方式认为###可能会显示为一个字符串,那么你可以使用类似 ~!@*@&$@#!或者任何你认为 100% 安全不会出现在字符串中的东西。

Run Here

import re

regex = r"([A-Z]+)"
test_str = "agePowerSellerUpdateConsumerApplicationMetaDataDomainageMetadataServiceConsumerBBc"
subst = "###\\1"
result = re.sub(regex, subst, test_str, 0)

if result:
  print(re.split("###", result))

【讨论】:

  • 试试agePowerSellerUpd###ateConsumer 甚至agePowerSellerUpdate###Consumer
  • 你试图提出的问题可以通过永远不会出现或指定为单词或任何东西的东西来解决,例如 ~!!@*@!bulbus~!!@*@!!可以用来代替### ...我认为它很容易理解
  • 我想说的是,您可以使用第一个 re 本身进行拆分,而不是使用第二个 re!
  • 不,对于我的正则表达式,如果我第一次使用 split 那么大写字符会消失,或者如果我将其作为捕获组,那么大写字符将分别作为不同的单词出现。
  • 我的意思是找到而不是拆分。
【解决方案2】:
import re
s='PageMetadataServiceConsumer, PowerSellerUpdateConsumerApplication, MetaDataDomain'
reg=r'[A-Z](?![a-z]*\b)[a-z]+'
a=re.sub(reg,'\g<0> ',s)
print(a)

输出

Page Metadata Service Consumer, Power Seller Update Consumer Application, Meta Data Domain

说明

[A-Z]        #First char with capital letter
(?!          #START Negative Look ahead: Do not match if the first char is followed by this
[a-z]*\b    #do not match if it ends with a word boundary \b(last part)
)            #END Negative Look ahead
[a-z]+      #Select all the remaining lower case chars.


a=re.sub(reg,'\g<0> ',s) #Replace the matches with match \g<0> by appending a space to it.

工作正则表达式here。 工作python示例here


如果您只想要单词,请使用以下内容:-

reg=r'[A-Z]+[a-z]+'
for a in re.findall(reg,s):
  print(a)

输出

Page
Metadata
Service
Consumer
Power
Seller
Update
Consumer
Application
Meta
Data
Domain

【讨论】:

  • 你的正则表达式使 BBcBlablabla 变成 B,Bc Blablabla
  • @RizwanM.Tuman 不,它没有,你能再试一次吗?我的链接可能有旧版本。
  • 与我的答案比较时,使用前瞻会变慢...您可以自己进行基准测试
  • @RizwanM.Tuman 我必须给你答案!我投票赞成你的
  • @RizwanM.Tuman 虽然根据 OP 的说法,他只需要文字,所以我的第二部分答案仍然比你的更快;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多