依旧是上一篇文章中的问题,这一次我们换了word2vec模型,不过这一次的model不能在命令行下直接使用,而是必须由python中的gensim模块加载后才能使用,这就带来了一个问题,python中的浮点数精度很高,如果我们输出时只需要保留n位有效数字,或者小数点后n位该怎么办呢?

sent2vec

python的Formatter可以很好地帮我们解决这个问题。Formatter原本是用于规整字符串的一个类,最简单也是最常见的用法是使用Formatter的format()函数在字符串中占位,然后填充变量的值,相较其它语言必须在占位的同时声明类型的语法,真的是非常友好:

>>> 'Hello {}, I‘m {} years old.'.format('world', 26)
'Hello world, I‘m 26 years old.'

言归正传,如何保留n位有效数字和小数点后n位呢?这时候就需要额外的关键字了,这个关键字在官方文档里叫format_string,甚至还为这个format_string专门搞了一个mini language,大概可以直接parse成语法树。。。[1]

其中,保留有效数字的关键字是g,小数点后n位数的则是f,还有科学计数法e和转换成百分比之后保留小数点后n位数的骚操作%。示例如下:

>>> format(12.456789, '.3g')
'12.5'
>>> format(12.456789, '.3f')
'12.457'
>>> format(12.456789, '.3e')
'1.246e+01'
>>> format(12.456789, '.3%')
'1245.679%'

如果需要的是浮点数而不是字符串的话,再加一层强制转换,注意百分数不可以强制转换:

>>> float(format(12.456789, '.3g'))
12.5
>>> float(format(12.456789, '.3f'))
12.457
>>> float(format(12.456789, '.3e'))
12.46
>>> float(format(12.456789, '.3%'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '1245.679%'

来源:

  1. 15. Floating Point Arithmetic: Issues and Limitations
  2. 6.1.3.1. Format Specification Mini-Language

如果有发现我写错的地方,欢迎邮件联系我letian.feng@hotmail.com,或者直接在这个博客的repo里提pull request或issue也可以,谢谢!