我有一个字符串列表,这些字符串都是以'th'结尾的早期现代英语单词。这些包括仇恨,任命,毁灭等等 - 它们都是第三人称单数的共轭。
作为一个更大的项目的一部分(使用我的计算机将Gutenberg的Gargantua和Pantagruel的文字转换成更像20世纪英语的东西,以便我能够更容易地阅读它)我想删除最后一个所有这些单词中的两个或三个字符,并用's替换它们',然后对仍然没有现代化的单词使用略微修改的函数,两者都包含在下面。
我的主要问题是我从未设法在Python中输入正确的内容。我发现这部分语言在这一点上确实令人困惑。
这是删除th的功能:
from __future__ import division
import nltk, re, pprint
def ethrema(word):
if word.endswith('th'):
return word[:-2] + 's'
这是删除多余e的功能:
def ethremb(word):
if word.endswith('es'):
return word[:-2] + 's'
因此,'abateth'和'accuseth'这两个词会通过ethrema而不是ethremb(ethrema),而'abhorreth'这个词则需要通过这两个词。
如果有人能想出一种更有效的方式来做到这一点,我全都听见了。
这是我非常业余的尝试在需要现代化的标记化列表中使用这些功能的结果:
>>> eth1 = [w.ethrema() for w in text]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'ethrema'
所以,是的,这确实是打字的问题。这些是我用Python编写的第一个函数,我不知道如何将它们应用于实际的对象。
答案 0 :(得分:6)
ethrema()
不是str
类型的方法,您必须使用以下内容:
eth1 = [ethrema(w) for w in text]
#AND
eth2 = [ethremb(w) for w in text]
编辑(回答评论):
在您对功能进行一些小改动之前, ethremb(ethrema(word))
才会起作用:
def ethrema(word):
if word.endswith('th'):
return word[:-2] + 's'
else
return word
def ethremb(word):
if word.endswith('es'):
return word[:-2] + 's'
else
return word
#OR
def ethrema(word):
if word.endswith('th'):
return word[:-2] + 's'
elif word.endswith('es'):
return word[:-2] + 's'
else
return word