• 热门专题

python3nltk3将文本转换为libsvm要求的格式

作者:  发布日期:2014-04-14 20:51:39
Tag标签:文本  格式  
  • 学习svm是一个比较困难的过程。 要了解C,你会发现B是前提;学习B,又发现A是基础。 从前到后把顺利理了一下,写了一个简单的例子,描述创建libsvm语料格式文件的过程。

    环境:python3.2 nltk3

    特征选择:由于只是想了解一下大致的过程,所以没有严格按照NLP意义去做特征选择,仅以每个词的词频作为文本特征

    基本思路在代码中有注释

     

    import os
    import nltk
    
    index=1 #词袋索引
    wordbag={} #词袋
    
    '''
    *************************************************************************************************
    * 作用:生成词袋                                                                                *
    * 原理:                                                                                        *
    *	1、扫描所有文本文件,借助nltk对单个文本进行词频统计,得到该文本不重复的词集                 *
    *	2、遍历上述词集,与词袋中已有词比对,如果词袋中已有当前词,则忽略;如果没有,则添加到词袋中 *
    *************************************************************************************************
    '''
    print("开始创建词袋...")
    dirs=os.listdir('D:/sogouOutput/')#读目录 
    stopwords=['、','(',')',',','。',':','“','”','
     ',' ','的','‘','’',' '] #停用词
    for d in dirs:
    	subdir=os.listdir('D:/sogouOutput/'+d)
    	for f in subdir:
    		text=open('D:/sogouOutput/'+d+'/'+f,'r',encoding='utf-8').read()
    		print('D:/sogouOutput/'+d+'/'+f)
    		fredist=nltk.FreqDist(text.split(' ')) #单文件词频
    		for localkey in fredist.keys(): #获取统计后的不重复词集
    			if localkey in stopwords: #判断是否为停用词
    				continue
    			if localkey in wordbag.keys(): #判断该词是否已在词袋中
    				continue
    			else:
    				wordbag[index]=localkey
    				index=index+1		
    print('词袋:',sorted(wordbag.items()))
    print("开始创建完成。
    开始进行文字转换...")
    
    '''
    ********************************************************************************************
    * 作用:根据词袋将文本内容转换为词袋中对应词的索引号,并生成libsvm要求的格式               *
    * 原理:                                                                                   *
    *	1、扫描所有文本文件,并根据空格分隔为list                                              *
    *	2、遍历上述list,判断当前词是否在词袋中,如果在,获取该词在词袋中的索引号              *
    *	   上述遍历完成后,后获取原有文本中所有词在词袋中对应的索引号,即已经从文本转换为数字  *
    *	3、借助nltk,重新获取转换后文本的词频                                                  *
    *	4、将词频根据key值排序(即对应为原来文本词的那些数字)                                 *
    *	5、遍历排序后的词频,生成符合libsvm格式的字符串                                        *
    *	6、将上述字符串写到文本中                                                              *
    ********************************************************************************************
    '''
    featuresstring='' #保存最终的特征内容
    for d in dirs:
    	subdir=os.listdir('D:/sogouOutput/'+d)
    	for f in subdir: #遍历目录下的txt文件
    		featuresstring+='1 '
    		newtextstring='' #保存每个文本中不重复的词在词袋中的索引号
    		text=open('D:/sogouOutput/'+d+'/'+f,'r',encoding='utf-8').read()
    		print('D:/sogouOutput/'+d+'/'+f)
    		wordsfromtext=text.split(' ') #保存文本中以空格分隔后的内容,为list
    
    		#根据词袋 查找文本中的词,并获取其在词袋中的索引号,连接成字符串
    		for w in wordsfromtext:
    			for item in wordbag.items():
    				if item[1]==w and item[0]!='':
    					newtextstring+=str(item[0])+' '	
    
    		fredist=nltk.FreqDist(newtextstring.split(' ')) #单文件词频
    		fredist.pop(('')) #删除无用项
    		
    		#将fredist由字符型转换为Int型,方便排序
    		temp=[]
    		for i in fredist.items():
    			temp.append([int(i[0]),int(i[1])])
    		fredist=dict(temp)
    		#转换结束
    
    		#根据上述转换结果,先排序,再按照libsvm格式生成字符串
    		for item in sorted(fredist.items()): 
    			featuresstring+= str(item[0])+":"+str(item[1])+" "
    		featuresstring+='
    '
    print("文件内容转换成功。特征内容:")
    print(featuresstring)
    f=open('D:/sogouOutput/svm_feature.txt','w',encoding='utf-8')
    f.write(featuresstring)
    print("特征文件创建成功。")

     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规