#!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相关推荐

最新文章

  1. AI 真的能够理解人类语言吗?
  2. 机器学习工业复现的 12 个要素!
  3. 4.4.4 Factory方法
  4. IE下ajax响应慢,IE9上的Jquery Ajax调用非常慢,但在IE9中非常快
  5. [JS] 动态修改ckPlayer播放器宽度
  6. 重磅:Swagger3.0 官方 starter 诞生了,其它的都可以扔了~
  7. springboot图书管理怎么实现借书时间到期提醒_智能机器人充当图书管理员,看看它能干嘛...
  8. Oracle 数据字典表 -- SYS.COL$
  9. 【设计模式:单例模式】使用单例模式加载properties文件
  10. 可以在循环体内声明局部变量吗?
  11. JAVA入门级教学之(匿名内部类)
  12. 机器学习 —— 概率图模型(推理:采样算法)
  13. Pyrhon矩阵问题的解决方法
  14. 测试你的样子长得美与丑「超准的测试」
  15. java开发html如何转换为word,Java怎么将html转换成word
  16. Arduino学习总结
  17. AS400 资料并分享面经一
  18. 每日算法 - 列出24点游戏的所有解法
  19. dva的用法_使用 dva 构建小型前端项目 (一)
  20. leetcode-跳跃游戏系列

热门文章

  1. 提高MySQL数据库查询效率的几个技巧(转载)
  2. LeetCode题解——Palindrome Number
  3. CSP学习之ASN.1编码(一)
  4. 昨天购入mac mini一台,4688元港币
  5. 文本前后空格去除工具
  6. Java高并发BlockingQueue重要的实现类二
  7. php代码敲得很慢,thinkphp好慢 帮忙看看什么原因?已贴代码
  8. 转一篇矩阵方面有趣的文章
  9. cocos2dx骨骼动画Armature源码分析(一)
  10. 外贸视频教程[外贸人zencart自助建站视频教程]:第一课