这次为了做NLP的第一个作业:隐马尔科夫模型的词性判断,开始接触pandas,numpy和pandas我真的很不熟,导致了作业晚交,理解了原理但代码写得很痛苦。

用测试集计算了词性之间的转移概率,转换成矩阵;以及词性到单词的发射概率,转换成矩阵,记得import numpy as np。

veterbi 算法获取预测的词性结果,因为我传进去的观察序列,也就是测试句转换成的单词表,是训练集的每个句子的单词在测试集的单词列表中的对应的索引,所以生成的词性列表就要和传进去的观察序列重新匹配上,才能判断到底预测得对不对。

可把我给难到了,我返回的预测结果是一个矩阵,行的索引是全部训练集里的全部词性,列的索引是每个单词。本来就也不知道怎么做,用了numpy的求每列的最大值的行索引和列索引的方法来返回了一个row, col,其中axis=0是每行,axis=1是每列。row是每列最大值对应的行号组成的列表,col是每列最大值的列号。然后在test_output里新增(单词,词性),有多少个单词新增多少个这样的元组。但是这样的代码可读性太差了,我估计自己第二天来看就看不懂这些col[i]是些什么。

row, col = np.where(np.max(F, axis=0))  # get the max pos for each word
    for i in range(len(obs_seq)):test_output.append((obs_seq[col[i]], pi[row[i]]))  # tag index in emission array

然后我又用了第二种办法,把输出矩阵F转换成pandas的dataframe,这个dataframe的行索引还是定义为训练集的全部词性,列索引还是每个单词,但是这样行列就不是123...这种可读性极差的东西了,可以很直观地看出每个单词的词性预测结果里,哪个词性的概率最大。那么我只需要新增一行,表示最大概率的那个数字就可以了。当然要先import pandas哈。其中F是预测结果的矩阵,transitions_probability是转移概率矩阵,emissions_probability是发射概率矩阵,obs_seq是观察序列。F_df是F转换成dataframe。

for sent in test_sents:# get the number of total test sentencestotal_count += 1#  get expected output of a specific sentence in test setexpected_output = []words_list = []for token in sent:expected_output.append( (token.get('form'), token.get('upos')) )for i in range(len(sorted_words_set)): # get token's index in sorted train_sents words listif sorted_words_set[i] == token.get('form'):obs_seq.append[i]words_list.append(token.get('form'))F = viterbi(transitions_probability, emissions_probability, pi, obs_seq)F_df = pd.DataFrame(F, index=sorted_tags_set,  columns=words_list , )
F_df.loc['max_idx'] = emission_df.idxmax(axis=0) #求每一列的最大值对应的行索引

然后我要把F_df的列索引,也就是单词列表,和max_idx这一行,也就是每个单词的预测词性这一行一一匹配上。对于怎么取出这一行,我其实试了很多方法,但是都不对,反正是并不困难的事吧,后来直接用最简单的

F_df.values[-1] 取出来了,不需要tolist(),也不要需要astype(str)。之前我查的是,dataframe里字符串是object,但是我需要转成python里的str才能进行迭代(我的代码需要),哎呀然后发现直接用下标访问就可以了,

F_df.values[-1][i]这样就可以。

然后,再记录下另外两种取出最后一行的方法哈:

F_df.tail(1).values.tolist()  这个很简单,但是数据形式是dataframe的,不是我需要的,这里没有用。

F_df.iloc[-1].tolist()

这个其实也可以,通过下标去取的。

pandas, dataframe获取最后一行的三种方法相关推荐

  1. java 获取键盘点击_Java中获取键盘输入值的三种方法介绍

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  2. 反射:获取Class类的三种方法

    反射:获取Class类的三种方法 // 1.Class类中的一个静态方法:forName(全限名:包名 + 类名) Class c = Class.forName(路径); System.out.pr ...

  3. java 获取当前时间的三种方法是什么

    本文主要介绍java获取当前时间的三种方法.这篇文章很详细,有一定的参考价值.有需要的朋友可以参考一下. 总结一些java中获取当前时间的方法. System.currentTimeMillis() ...

  4. java当前时间_java 获取当前时间的三种方法

    总结java里面关于获取当前时间的一些方法 System.currentTimeMillis() 获取标准时间可以通过System.currentTimeMillis()方法获取,此方法不受时区影响, ...

  5. php中获取对象的属性值,PHP获取对象属性的三种方法

    今天查看yii源码,发现yii\base\Model中的attribute()方法是通过反射获取对象的public non-static属性.记得以前看到的代码都是用get_object_vars() ...

  6. JAVA获取当前时间的三种方法

    1.java.util.Date day=new Date(); SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:s ...

  7. java 获取随机数字的三种方法

    1 //方法1 (数据类型) 2 //(最小值+Math.random()*(最大值-最小值+1)) 3 // 例: 4 (int)(1+Math.random()*(10-1+1)) //从1到10 ...

  8. php post如何获取数据,php获取POST数据的三种方法

    方法一,$_POST $_POST或$_REQUEST存放的是PHP以key=>value的形式格式化以后的数据. $_POST方式是通过 HTTP POST 方法传递的变量组成的数组,是自动全 ...

  9. 获取表单对象,得三种方法getElementById(), getElementsByName(), and getElementsByTagName() 和用法...

    今天碰到了翻页不好用的问题,检查一下发现没有表单,加上去就好了,发现获取某个对象值的方法有很多,但是使用哪一个才是正规的途径那,问了同事,得出结论如下:   document.表单名称.对象名称.属性 ...

最新文章

  1. XCode4 实践HelloWorld
  2. 【Android】Uri、UriMatcher、ContentUris详解
  3. 强势崛起的Python会在十年内取代Java吗?
  4. AVIO内存输入模式
  5. 服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...
  6. o_rdonly_O_RDWR, O_CREAT等open函数标志位在哪里定义? | 学步园
  7. python中模块和包是什么_Python中模块和包的概念
  8. hiho1482出勤记录II(string类字符串中查找字符串,库函数的应用)
  9. PostgreSQL的几种分布式架构对比
  10. mongodb 连接失败
  11. python实战项目(Django技术点)
  12. 中职学生计算机学情分析报告,中职学校学生学情分析及对策
  13. ABAQUS2017帮助文档查看_51CAE_新浪博客
  14. FEMA和地×××府运用GIS对抗灾害
  15. 计算机如何隐藏任务栏的程序,Win7隐藏任务栏
  16. 南方cass提取坐标生成表格_南方cass方格网角点坐标及高程的识别与导出
  17. java二重积分_用java实现二重积分的计算
  18. 前端学习个人心得,总结(个人向)
  19. 关于Qt高分屏缩放几个知识点
  20. (挺好)最详细的Yolov3边框预测分析

热门文章

  1. 读“王东升 新时空 硅碳融合的产业革命”拙见
  2. orcad capture 快速制作原理图库
  3. PPT2010封装为exe教程
  4. Android做3D旋转动画,Android编程实现3D旋转效果实例
  5. MATLAB使用AppDesigner制作测试界面的入门小案例
  6. 小芳同学的错题总结(十四)
  7. 分布式任务调度框架和微服务的区别
  8. 安装SeisMix计算跨密度混合面
  9. 海南安全员A证怎么考多选题库
  10. 安卓代码播放手机本地视频