序数替换
nlp
nltk
python
4
0

我目前正在寻找用适当的序数表示法(第一,第二,第三)替换第一,第二,第三等单词的方法。上周我一直在使用Google搜索,但找不到NLTK的任何有用的标准工具或功能。

那么,有没有或者我应该手动编写一些正则表达式?

感谢您的任何建议

参考资料:
Stack Overflow
收藏
评论
共 10 个回答
高赞 时间 活跃

这是使用num2words软件包的替代选项。

>>> from num2words import num2words
>>> num2words(42, to='ordinal_num')
    '42nd'
收藏
评论

如果您不想增加对外部库的依赖(如luckydonald建议 ),但又不想让代码的未来维护者困扰您并杀死您(因为您在生产中使用了经过改进的代码 )然后是一个简短但可维护的变体:

def make_ordinal(n):
    '''
    Convert an integer into its ordinal representation::

        make_ordinal(0)   => '0th'
        make_ordinal(3)   => '3rd'
        make_ordinal(122) => '122nd'
        make_ordinal(213) => '213th'
    '''
    n = int(n)
    suffix = ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)]
    if 11 <= (n % 100) <= 13:
        suffix = 'th'
    return str(n) + suffix
收藏
评论

我想在我的项目中使用序数,在一些原型之后,我认为这种方法虽然不小,但适用于任何正整数,可以适用于任何整数

它通过确定数字是大于还是小于20来工作,如果数字小于20,它将把int 1转换为字符串1st,2,2nd;三三其余的将添加“ st”。

对于超过20的数字,将使用最后一位和倒数第二位,我分别称其为tens和unit,然后测试它们以查看要添加到数字上的内容。

顺便说一下,这是在python中进行的,所以我不确定其他语言是否能够找到字符串中的最后一位或倒数第二位(如果他们这样做的话)应该很容易翻译。

def o(numb):
    if numb < 20: #determining suffix for < 20
        if numb == 1: 
            suffix = 'st'
        elif numb == 2:
            suffix = 'nd'
        elif numb == 3:
            suffix = 'rd'
        else:
            suffix = 'th'  
    else:   #determining suffix for > 20
        tens = str(numb)
        tens = tens[-2]
        unit = str(numb)
        unit = unit[-1]
        if tens == "1":
           suffix = "th"
        else:
            if unit == "1": 
                suffix = 'st'
            elif unit == "2":
                suffix = 'nd'
            elif unit == "3":
                suffix = 'rd'
            else:
                suffix = 'th'
    return str(numb)+ suffix

我将函数称为“ o”是为了易于使用,可以通过导入文件名来调用该文件名,该文件名先由import ordinal然后由ordinal.o(number)导入。

让我知道你的想法:D

收藏
评论

如果使用django,则可以执行以下操作:

from django.contrib.humanize.templatetags.humanize import ordinal
var = ordinal(number)

(或在Django模板中使用ordinal作为预期的模板过滤器,尽管从python代码像这样调用它也可以)

如果不使用django,则可以窃取它们的实现 ,这非常整洁。

收藏
评论

这个怎么样:

suf = lambda n: "%d%s"%(n,{1:"st",2:"nd",3:"rd"}.get(n if n<20 else n%10,"th"))
print [suf(n) for n in xrange(1,32)]

['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',
 '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th',
 '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th',
 '29th', '30th', '31st']
收藏
评论

一个问题的公认答案具有算法的一半:将"first"变成1 。要从那里转到"1st" ,请执行以下操作:

suffixes = ["th", "st", "nd", "rd", ] + ["th"] * 16
suffixed_num = str(num) + suffixes[num % 100]

仅适用于数字0-19。

收藏
评论

这是Gareth在codegolf上采用的简洁解决方案:

ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n/10%10!=1)*(n%10<4)*n%10::4])

适用于任何数量:

print([ordinal(n) for n in range(1,32)])

['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',
 '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th',
 '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th',
 '29th', '30th', '31st']

对于python 3.4+,需要math.floor

import math
ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(math.floor(n/10)%10!=1)*(n%10<4)*n%10::4])
收藏
评论

如果您不想导入外部模块,而更喜欢单行解决方案,那么以下内容(可能)比接受的答案更具可读性:

def suffix(i):
    return {1:"st", 2:"nd", 3:"rd"}.get(i%10*(i%100 not in [11,12,13]), "th"))

根据https://codereview.stackexchange.com/a/41300/90593https://stackoverflow.com/a/36977549/5069869的建议,它使用字典.get

我使用了带布尔的乘法来处理特殊情况(11,12,13),而不必启动if块。如果条件(i%100 not in [11,12,13])求值为False ,则整数为0,我们得到默认的'th'大小写。

收藏
评论

另一个解决方案是num2words库( pip | github )。它特别提供不同的语言 ,因此本地化/国际化(又名l10n / i18n)是不费吹灰之力的。

使用pip install num2words安装后,使用起来很容易:

from num2words import num2words
# english is default
num2words(4458, to="ordinal_num")
'4458rd'

# examples for other languages
num2words(4458, lang="en", to="ordinal_num")
'4458rd'

num2words(4458, lang="es", to="ordinal_num")
'4458º'

num2words(4458, lang="de", to="ordinal_num")
'4458.'

num2words(4458, lang="id", to="ordinal_num")
'ke-4458'

奖金:

num2words(4458, lang="en", to="ordinal")
'four thousand, four hundred and fifty-eighth'
收藏
评论

我发现自己做了类似的事情,需要将具有序数的地址(“第三圣”)转换为地理编码器可以理解的格式(“第三圣”)。尽管这不是很优雅,但一种快速而肮脏的解决方案是使用inflect.py生成字典进行翻译。

inflect.py具有一个number_to_words()函数,该函数会将数字(例如2 )转换为其单词形式(例如'two' )。另外,还有一个ordinal()函数,该函数可以采用任何数字(数字或单词形式)并将其转换为序数形式(例如4 > fourthsix -> sixth )。这些都不是单独执行的,但是您可以一起使用它们来生成字典,以将任何提供的序数词(在合理范围内)转换为相应的数字序数。看一看:

>>> import inflect
>>> p = inflect.engine()
>>> word_to_number_mapping = {}
>>>
>>> for i in range(1, 100):
...     word_form = p.number_to_words(i)  # 1 -> 'one'
...     ordinal_word = p.ordinal(word_form)  # 'one' -> 'first'
...     ordinal_number = p.ordinal(i)  # 1 -> '1st'
...     word_to_number_mapping[ordinal_word] = ordinal_number  # 'first': '1st'
...
>>> print word_to_number_mapping['sixth']
6th
>>> print word_to_number_mapping['eleventh']
11th
>>> print word_to_number_mapping['forty-third']
43rd

如果您愿意花一些时间,则可以检查这两个函数中inflect.py的内部功能,并构建自己的代码以动态地执行此操作(我没有尝试执行此操作)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号