我正在使用NLTK对文本文件执行kmeans聚类,其中每一行都被视为一个文档。例如,我的文本文件如下所示:
属于手指死亡冲孔<;br>;
仓促<;br>;
迈克·哈斯蒂·沃尔斯·杰里科<;br>;
jägermeister规则<;br>;
规则乐队遵循表演jägermeister舞台<;br>;
方法
现在,我尝试运行的演示代码如下:
导入系统
进口numpy
从nltk.cluster导入KMeansClusterer、GAAClusterer、欧氏距离
导入nltk.corpus
从nltk导入装饰程序
导入nltk.stem
stemmer_func=nltk.stem.EnglishStemmer().stem
stopwords=set(nltk.corpus.stopwords.words(’english’))
@装潢师
def标准化单词(word):
返回词干分析器函数(word.lower())
def get_单词(标题):
words=set()
对于职务中的职务(职务):
对于title.split()中的单词:
添加(规范化单词)
退货清单(字)
@装潢师
def矢量(标题):
title\u components=[为title.split()中的单词规范化\u单词(单词)]
返回numpy.array([
title_组件中的单词,而不是stopwords中的单词
对于单词中的单词,]numpy.short)
如果uuuu name uuuuuu=’\uuuuuuu main\uuuuuuu’:
文件名=’example.txt’
如果len(sys.argv)==2:
filename=sys.argv[1]
打开(文件名)作为标题文件:
作业标题=[line.strip()表示标题文件中的行。readlines()]
单词=获得单词(工作头衔)
#聚类=KMeansClusterer(5,欧氏距离)
集群=砷化镓集群器(5)
cluster.cluster([job\u titles if title中的title的向量间隔(title)])
#注意:这是低效的,cluster.classify应该只是
#在对以前看不见的示例进行分类时调用!
分类示例=[
分类(向量间距(标题))用于职务标题中的标题
]
对于集群id,标题已排序(zip(已分类的示例、工作标题)):
打印群集id、标题
(也可在此处找到)
我收到的错误是:
回溯(最近一次呼叫最后一次):
文件“cluster_example.py”,第40行,在
单词=获得单词(工作头衔)
文件“cluster_example.py”,第20行,用get_words表示
添加(规范化单词)
文件“”,第1行,在
文件“/usr/local/lib/python2.7/dist packages/nltk/decorators.py”,第183行,在memoize中
结果=func(*args)
文件“cluster_example.py”,第14行,在normalize_word中
返回词干分析器函数(word.lower())
文件“/usr/local/lib/python2.7/dist-packages/nltk/stem/snowball.py”,第694行,在stem中
word=(word.replace(u“\u2019”,u“\x27”)
UnicodeDecodeError:“ascii”编解码器无法解码第13位的字节0xe2:序号不在范围内(128)
这里发生了什么
正在将文件读取为一组strs,但它应该是unicodes。Python尝试隐式转换,但失败。更改:
job\u titles=[line.strip()用于title\u file.readlines()中的行]
要将strs显式解码为unicode(此处假设为UTF-8):
作业标题=[line.decode('utf-8').strip()用于标题文件中的行。readlines()]
也可以通过导入编解码器模块并使用编解码器.open而不是内置的open来解决此问题