simpleHandleData
2024-05-18 16:30:18
#!usr/bin/python #coding=utf-8import os########################################################################## #文件编码类型判断 def obtainFileType(ff):import chardet enc=chardet.detect(ff) return enc['encoding'] #返回文件类型######################################################################### #判断文件是否存在 def fileExists(filepath):if os.path.exists(filepath):return 1 #存在else:return 0 #不存在######################################################################### #按照"/"分开关键词 #string 关键词的字符串 def ParticipleBySprit(string):rpos = len("【标引词】")keyString = string[rpos:].strip() #截取关键词, 并去掉左右2边空格keywordsList = keyString.split("/") #将字符串以"/"分割成,存储在列表中#print obtainFileType(keywordsList[0]) #utf8编码#print keyString#print len(keywordsList)return keywordsList######################################################################### #获取题目字符串 #string 题目的字符串 def havingArticleTitle(string):rpos = len("【来源文献】")ArticleTitle = string[rpos:].strip() #截取关键词, 并去掉左右2边空格return ArticleTitle######################################################################### #统计算法 第一种, 简单统计-----在文章标题, 依次检索关键词, 然后统计次数 #即出现一次就计数加一, 然后存入frequence列表中 #解释: 同一个关键词只计算一次, 最多出现一次 def simpleFrequencyOne(keyList, articleTitleStr, frequence):count = 0for i in range(len(keyList)):while True:pos = articleTitleStr.find(keyList[i])if -1 == pos: #查询失败, 字符串找不到关键词,就退出breakelse:count = count + 1breakfrequence.append(count) #将统计出来的词频,填入列表######################################################################### #统计算法 第二种, 简单统计----在文章标题, 依次去检索关键词, 然后统计出现的次数, #即出现一次就计数加一, 然后存入frequence列表中 #解释: 同一个词, 可能出现几次, 这里不考虑语境, 只是单纯计数, 计算关键词出现的次数 def simpleFrequencyTwo(keyList, articleTitleStr, frequence):count = 0for i in range(len(keyList)):start = 0while True:pos = articleTitleStr.find(keyList[i], start)if -1 == pos: #查询失败, 字符串找不到关键词,就退出breakelse:start = pos + len(keyList[i])count = count + 1frequence.append(count) #将统计出来的词频,填入列表######################################################################### #统计算法 第三种, 简单统计----在文章标题, 依次去检索关键词, 然后统计出现的次数, #即出现一次就计数加一, 然后存入frequence列表中 #解释: 同一个词, 可以出现几次, 且计数, 但是, 同样一个位置, 不能被统计2次, #也就是说, 一个位置只能被唯一一个关键词所占有 def simpleFrequencyThr(keyList, articleTitleStr, frequence): count = 0 #统计词汇的出现次数singleTtile = [0] * len(articleTitleStr.decode('utf-8')) #构造标记列表for i in range(len(keyList)): start = 0 #匹配的开始位置while True:pos = articleTitleStr.decode('utf-8').find(keyList[i].decode('utf-8'), start) #转换为utf-8, 计算英文和汉字的真实长度if -1 == pos: #查询失败, 字符串找不到关键词,就退出breakelse:startSin = pos #检索到关键词的开始位置endSin = pos + len(keyList[i].decode('utf-8')) #检索到关键词的结束位置singal = False #标记字符串的位置,是否已经被计数过for ipos in range(startSin, endSin):if singleTtile[ipos] == 1: #已经标记了singal = True #标记了,就改变状态#print "change id"breakif singal == False: #如果该位置,没有使用过,for spos in range(startSin, endSin): #标记该位置的所有文字, 使其以后不能被使用singleTtile[spos] = 1count = count + 1 #计数器加1 start = pos + len(keyList[i].decode('utf-8')) #改变索引的起始位置 frequence.append(count) #将统计出来的词频,填入列表#print "count =============", count#print "singleTtile====", singleTtile######################################################################### #计算关键词在标题中使用的频率 #keyList 关键词列表 #articleTitleStr 题目的字符串 #switchCase#这3个列表都是顺序存储,一一对应.#titleLen 题目长度的列表#keyWordsNum 关键词个数的数组#frequence 关键词出现的次数 def count_KeyWords_In_ArticleTitle_Frequency(keyList, articleTitleStr, switchCase, titleLen, keyWordsNum, frequence):#print 'ipos', ipostitleLen.append(len(articleTitleStr.decode('utf-8'))) #统计, 存储题目的长度, 先转换为utf8,然后计数keyWordsNum.append(len(keyList)) #存储关键词的个数if switchCase == "1":simpleFrequencyOne(keyList, articleTitleStr, frequence)if switchCase == "2":simpleFrequencyTwo(keyList, articleTitleStr, frequence)if switchCase == "3":simpleFrequencyThr(keyList, articleTitleStr, frequence) ######################################################################### #加权平均值-------使用未知权重的情况 # k 关键词个数 # f 出现的次数def countWeightedMeans(k, f):molecule = 0 #分子nominator = 0 #分母for i in range(len(k)):molecule += int(k[i]) * int(f[i])nominator += int(k[i])#print moleculeprint "无权重的加权平均值: ".decode('utf-8'), molecule * 1.0 /nominator######################################################################### #打印获取的列表数据 def PrintList(articleTitleList, keyStrList, titleLen, keyWordsNum, frequence):#print " frequence", len(frequence)if len(titleLen) == len(keyWordsNum) and len(frequence) == len(keyWordsNum):for i in range(len(titleLen)):print iprint " 题 目:".decode('utf-8'), articleTitleList[i].decode('utf-8')print " 关键词:", keyStrList[i][15:].strip().decode('utf-8')print "title length:".decode('utf-8'), titleLen[i], " key words number:".decode('utf-8'), keyWordsNum[i], " frequence:".decode('utf-8'), frequence[i]print "\n"######################################################################### #数据录入 ,读取存入文件 #参数:文件名(绝对路径) def ReadFileAndSimpleHadnle(filePath):if 0 == fileExists(filePath):print "\n", filePath, "file is not exist\n"return 0articleTitleStr = "" #标题字符串初始化articleTitleList = [] #标题列表初始化keyStrList = [] #关键词字符串初始化 keyList = [] #存储关键词的列表初始化titleLen = [] #文章标题的长度的列表初始化keyWordsNum = [] #关键词的个数的列表初始化frequence = [] #出现的次数的列表初始化print "\n"print "第一种: 统计关键词, 一个关键词只计算一次(最多出现一次)\n"print "第一种: 统计关键词, 出现一次, 计数器加一, 同一个词, 可能出现多次.\n 这里不考虑语境, 只是单纯计数, 计算关键词出现的次数\n"print "第三种: 统计关键词, 同一个词, 可以出现多次, 但是, 同样一个位置, 不能被统计2次. \n 也就是说, 一个位置只能被唯一一个关键词所占有\n"switchCase = raw_input('choose difference Statistics model : ') #选择不同的统计模型 fileData = open(filePath)fileData.seek(0)lines = fileData.readlines()if len(lines) < 1: #至少也要有一篇, 一个题目,一组关键词print "\n" + " " * 15 +"file is empty\n"return 0 #没有数据,就退出#print len(lines) ipos = 0for line in lines:#if ipos >= 20:#breakif 0 == line.find("【来源篇名】") or 0 == line.find("【来源文献】"):articleTitleStr = havingArticleTitle(line) #获取标题 articleTitleList.append(articleTitleStr)#print line.decode('utf-8') #在控制台真确输出elif 0 == line.find("【标引词】"):keyList = ParticipleBySprit(line) #获取关键词 keyStrList.append(line)#print line.decode('utf-8') #在控制台真确输出#进行数据处理,计算关键字在文章题目中出现的频率#print 'ipos', ipos count_KeyWords_In_ArticleTitle_Frequency(keyList, articleTitleStr, switchCase, titleLen, keyWordsNum, frequence)ipos = ipos + 1fileData.close()#print len(articleTitleList)#PrintList(articleTitleList, keyStrList, titleLen, keyWordsNum, frequence)countWeightedMeans(keyWordsNum, frequence) #计算频率,显示结果######################################################################### if __name__ == "__main__":filePath = 'S:/date/articleData/articleTitle.txt' #数据保存的绝对地址 ReadFileAndSimpleHadnle(filePath) #stringtest = "【标引词】制度现代化/公共选择/民本主义/自由与民主" #print len("【标引词】") #print stringtest.index("【标引词】")
转载于:https://www.cnblogs.com/hgonlywj/p/4842674.html
simpleHandleData相关推荐
最新文章
- AI 真的能够理解人类语言吗?
- 机器学习工业复现的 12 个要素!
- 4.4.4 Factory方法
- IE下ajax响应慢,IE9上的Jquery Ajax调用非常慢,但在IE9中非常快
- [JS] 动态修改ckPlayer播放器宽度
- 重磅:Swagger3.0 官方 starter 诞生了,其它的都可以扔了~
- springboot图书管理怎么实现借书时间到期提醒_智能机器人充当图书管理员,看看它能干嘛...
- Oracle 数据字典表 -- SYS.COL$
- 【设计模式:单例模式】使用单例模式加载properties文件
- 可以在循环体内声明局部变量吗?
- JAVA入门级教学之(匿名内部类)
- 机器学习 —— 概率图模型(推理:采样算法)
- Pyrhon矩阵问题的解决方法
- 测试你的样子长得美与丑「超准的测试」
- java开发html如何转换为word,Java怎么将html转换成word
- Arduino学习总结
- AS400 资料并分享面经一
- 每日算法 - 列出24点游戏的所有解法
- dva的用法_使用 dva 构建小型前端项目 (一)
- leetcode-跳跃游戏系列