python 3.5中文本文件的标记化

时间:2016-07-24 22:01:00

标签: python

我试图使用python 3.5对文本文件中的单词进行标记化,但有一些错误。这是代码:

import re
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r')
a=0
c=0
for line in f:
    b=re.split('[^a-z]', line.lower()) 
    a+=len(filter(None, b))
    c = c + 1
    d = d + b
print (a)
print (c)

我的问题:

  1. 构造a+=len(filter(None, b))在python 2.7中工作正常但在3.5中它会导致类型的错误:

      

    type' filter'没有len()

    如何使用python 3.5解决?

  2. 当我进行标记化处理时,我的代码也将空格作为字标记。我该如何删除它们?

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 您需要在Python 3.5中列出显式强制转换以获取序列的长度,因为filter返回迭代器对象而不是Python 2.7中的列表:

    a += len(list(filter(None, b)))
    #         ^^
    
  2. re.split返回的空格,例如:

    >>> line  = 'sdksljd sdjsh 1213hjs sjdks'
    >>> b=re.split('[^a-z]', line.lower())
    >>> b
    ['sdksljd', 'sdjsh', '', '', '', '', 'hjs', 'sjdks']
    
  3. 您可以使用列表理解中的if上的过滤器删除re.split的结果,如下所示:

    b = [i for i in re.split('[^a-z]', line.lower()) if i]
    

    列表中的if i部分。返回False表示空字符串,因为bool('') is False。所以空字符串被清除。

    列表理解的结果也可以通过filter(您已经与a一起使用)来实现:

    b = list(filter(None, re.split('[^a-z]', line.lower()))) # use the list comprehension if you don't like brackets
    

    最后,a可以在两种方法中的任何一种之后计算:

    a += len(b)