使用NLTK的单词袋模型

时间:2019-02-16 18:56:13

标签: python python-3.x

我正在尝试实现Bag of Words模型,无法在下面的代码中正确显示它

words_to_index={'hi': 0, 'you': 1, 'me': 2, 'are': 3}
ex=["hi how are you"]
Z=ex.split(" ")
ans=[[1,1,0,1]]
res=np.zeros(40)
for i in range(0,len(ex)+1):
    for key,val in words_to_index.items():
        if Z[i]==key:
            res[words_to_index[key]]=res[words_to_index[key]]+1
print(res)

遇到此错误-AttributeError: 'list' object has no attribute 'split'

1 个答案:

答案 0 :(得分:0)

您的代码包含许多错误和低效率。

在继续之前,也许花点时间弄清楚如何让您的程序告诉您有关您的假设的时间可能不正确。一个不错的开始是在分配ex之后添加:

print('ex is a {0}: {1!r}'.format(type(ex), ex))

会打印出变量的类型及其值。有了这个,您将很容易发现问题

ex is a <class 'list'>: ['hi how are you']

一种更高级的技术是使用logging,它使您可以在代码运行时轻松禁用诊断消息,如果希望对代码进行更改并看到它,以后可以再次启用它们仍然按照原计划进行。

import logging

logging.basicConfig(level=logging.DEBUG)

# ...
logging.debug('ex is a {0}: {1!r}'.format(type(ex), ex)))

完成调试后,只需将logging.basicConfig()更改为level=logging.WARN,这将禁用所有logging.debug()logging.info()输出的显示。有关详细信息,请参见documentation

另一种有用的调试工具是assert

assert isinstance(str, ex), 'ex is not a str: {0) ({1!r})'.format(type(ex), ex))

有关指导,请参见the Python Wiki。请注意,assert语句可以被禁用,例如当您启用对Python代码的优化后,因此您可能应该改为在代码中添加显式检查。

if not isinstance(str, ex):
    raise TypeError('ex must be a str, not {0} ({1!r})'.format(type(ex), ex)))

现在,有了这种方式,这是脚本的重构版本,其中包含我正在尝试执行的操作。

#!/usr/bin/env python

import numpy as np
import logging

logging.basicConfig(level=logging.DEBUG, format='%(module)s:%(asctime)s:%(message)s')

words_to_index={'hi': 0, 'you': 1, 'me': 2, 'are': 3}
ex = "hi how are you"                   # single string, not list of strings
#print('ex is {0} (type {1})'.format(ex, type(ex)))
logging.debug('ex is {0} (type {1})'.format(ex, type(ex)))
assert isinstance(ex, str), 'ex should be a string (is {0} {1!r})'.format(type(ex), ex)
Z=ex.split(" ")                         # maybe choose a more descriptive variable name
#ans=[[1,1,0,1]]                        # never used, commented out
res=np.zeros(40)
#for i in range(0,len(ex)+1):           # Looping over the wrong thing
for word in Z:
    logging.debug('word is {0}'.format(word))
    if word in words_to_index:          # words_to_index is a hash; no need to loop
        logging.debug('{0} found in {1}'.format(word, Z))
        res[words_to_index[word]] += 1  # notice increment syntax
        logging.debug('res[{0}] = {1}'.format(words_to_index[word], res[words_to_index[word]]))
print(res)

当然,这根本不使用NLTK。 NLTK库包含一些更高级的功能集,从正确的NLP标记化等开始,它们已经为您完成了其中的一些操作,但实际上并不包含TF组件。也许从Does NLTK have TF-IDF implemented?开始,它指向一些现有的实现。