热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FileNotFoundError:[Errno2]Nosuchfileordirectory:‘errors.out‘(python自然语言处理章节5.6最后的示例报错)

在使用python3.7运行NaturalLanguageProcessingwithPythonChapter5的最后一个示例fromnltk.tblimportdemoasbr

在使用python3.7运行Natural Language Processing with Python Chapter 5 的最后一个示例

from nltk.tbl import demo as brill_demo
brill_demo.demo()
print(open("errors.out").read())

时, 出现如下错误:


Traceback (most recent call last):
File "E:/Python Practice/NLP/Chapter5.py", line 332, in
print(open("errors.out").read())
FileNotFoundError: [Errno 2] No such file or directory: 'errors.out'

字面意思就是说,该文件不存在,在当前目录查找后也确实没有。通过搜索没有找到现成的解决方法,于是在StackOverflow求助,怀疑是nltk.tbl.demo模块的版本问题——是不是新的模块中有其他类似的生成errors.out文件的方法?

于是查看nltk/tbl/demo模块的源码,果然发现有一个类似的函数,如下

def demo_error_analysis():
"""
Writes a file with context for each erroneous word after tagging testing data
"""
postag(error_output="errors.txt")

根据注释,发现这个函数的功能正是生成类似errors.out的文件。于是自然就想到,我们只要首先执行demo_error_analysis()函数,然后读取生成的文件就好啦,

brill_demo.demo_error_analysis()

然而事情往往没有那么简单。。。运行后报错如下:

Traceback (most recent call last):
File "E:/Python Practice/NLP/Chapter5.py", line 331, in
brill_demo.demo_error_analysis()
File "D:\Anaconda3\lib\site-packages\nltk\tbl\demo.py", line 124, in demo_error_analysis
postag(error_output="errors.txt")
File "D:\Anaconda3\lib\site-packages\nltk\tbl\demo.py", line 322, in postag
u"\n".join(error_list(gold_data, taggedtest)).encode("utf-8") + "\n" #
TypeError: can't concat str to bytes

跟随提示的路径找到报错所在的源文件,如下

# writing error analysis to file
if error_output is not None:
with open(error_output, "w") as f:
f.write("Errors for Brill Tagger %r\n\n" % serialize_output)
f.write(
u"\n".join(error_list(gold_data, taggedtest)).encode("utf-8") + "\n"
)
print("Wrote tagger errors including context to {0}".format(error_output))

那么报错的意思就是说,在下面这一行,生成error_list时出现类型转换的问题了

u"\n".join(error_list(gold_data, taggedtest)).encode("utf-8") + "\n"

通过查阅这篇文章,发现问题所在:encode函数返回的是bytes类型的变量,不可以直接和string类型的变量合并,需要再调用decode函数,把bytes类型转变为string类型。

因此,解决方法很简单,即把这一行改成

u"\n".join(error_list(gold_data, taggedtest)).encode("utf-8").decode() + "\n" #add .decode()

(修改时可能会出现提示信息询问是否确认修改,放心大胆的改吧朋友们,如果不放心的话后面注释一下修改的内容,向我上面那样做)

经过小小的改动之后,再次运行 

brill_demo.demo_error_analysis()

这时候就正常啦!

Loading tagged data from treebank...
Read testing data (200 sents/5251 wds)
Read training data (800 sents/19933 wds)
Read baseline data (800 sents/19933 wds) [reused the training set]
Trained baseline tagger
Accuracy on test set: 0.8366
Training tbl tagger...
TBL train (fast) (seqs: 800; tokens: 19933; tpls: 24; min score: 3; min acc: None)
Finding initial useful rules...
Found 12799 useful rules.
B |
S F r O | Score = Fixed - Broken
c i o t | R Fixed = num tags changed incorrect -> correct
o x k h | u Broken = num tags changed correct -> incorrect
r e e e | l Other = num tags changed incorrect -> incorrect
e d n r | e
------------------+-------------------------------------------------------
23 23 0 0 | POS->VBZ if Pos:[email protected][-2,-1]
18 19 1 0 | NN->VB if Pos:[email protected][-2] & Pos:[email protected][-1]
14 14 0 0 | VBP->VB if Pos:[email protected][-2,-1]
12 12 0 0 | VBP->VB if Pos:[email protected][-1]
11 11 0 0 | VBD->VBN if Pos:[email protected][-1]
11 11 0 0 | IN->WDT if Pos:[email protected][1] & Pos:[email protected][2]
10 11 1 0 | VBN->VBD if Pos:[email protected][-1]
9 10 1 0 | VBD->VBN if Pos:[email protected][-1]
8 8 0 0 | NN->VB if Pos:[email protected][-1]
7 7 0 1 | VB->NN if Pos:[email protected][-1]
7 7 0 0 | VB->VBP if Pos:[email protected][-1]
7 7 0 0 | IN->WDT if Pos:[email protected][1] & Pos:[email protected][2]
7 8 1 0 | IN->RB if Word:[email protected][2]
6 6 0 0 | VBD->VBN if Pos:[email protected][-2,-1]
6 6 0 1 | IN->WDT if Pos:[email protected][1] & Pos:[email protected][2]
5 5 0 0 | POS->VBZ if Pos:[email protected][-1]
5 5 0 0 | VB->VBP if Pos:[email protected][-1]
5 5 0 0 | VBD->VBN if Word:[email protected][-2,-1]
4 4 0 0 | POS->VBZ if Pos:``@[-2]
4 4 0 0 | VBP->VB if Pos:[email protected][-2,-1]
4 6 2 3 | RP->RB if Pos:[email protected][1,2]
4 4 0 0 | RB->JJ if Pos:[email protected][-1] & Pos:[email protected][1]
4 4 0 0 | NN->VBP if Pos:[email protected][-2] & Pos:[email protected][-1]
4 5 1 0 | VBN->VBD if Pos:[email protected][-2] & Pos:[email protected][-1]
4 4 0 0 | IN->WDT if Pos:[email protected][1] & Pos:[email protected][2]
4 8 4 0 | VBD->VBN if Word:*@[1]
4 4 0 0 | JJS->RBS if Word:[email protected][0] & Word:[email protected][-1] & Pos:[email protected][-1]
3 3 0 0 | VBD->VBN if Pos:[email protected][-1]
3 4 1 0 | VBN->VB if Pos:[email protected][-1]
3 4 1 1 | IN->RB if Pos:[email protected][1]
3 3 0 0 | JJ->RB if Pos:[email protected][1]
3 3 0 0 | PRP$->PRP if Pos:[email protected][1]
3 3 0 0 | NN->VBP if Pos:[email protected][-1] & Pos:[email protected][1]
3 3 0 0 | VBP->VB if Word:n'[email protected][-2,-1]
Trained tbl tagger in 2.45 seconds
Accuracy on test set: 0.8572
Tagging the test data
Wrote tagger errors including context to errors.txt

我们可以看到当前目录下多出了一个errors.txt文件

最后一步,读取并输出文件

print(open("errors.txt").read())

输出内容如下(部分):

Errors for Brill Tagger None
left context | word/test->gold | right context
--------------------------+------------------------+--------------------------
| Soon/NN->RB | ,/, T-shirts/NNS *ICH*-1/
n/IN the/DT corridors/NNS | that/IN->WDT | *T*-2/-NONE- carried/VBD
NNS that/WDT *T*-2/-NONE- | carried/VBN->VBD | the/DT school/NN 's/POS f
D the/DT school/NN 's/POS | familiar/NN->JJ | red-and-white/JJ GHS/NNP
ool/NN 's/POS familiar/JJ | red-and-white/NN->JJ | GHS/NNP logo/NN on/IN the
iliar/JJ red-and-white/JJ | GHS/NN->NNP | logo/NN on/IN the/DT fron
/NN ,/, the/DT shirts/NNS | read/VBP->VBD | ,/, ``/`` We/PRP have/VBP
,/, ``/`` We/PRP have/VBP | all/DT->PDT | the/DT answers/NNS ./. ''
JJ colleagues/NNS are/VBP | angry/NN->JJ | at/IN Mrs./NNP Yeargin/NN
n/NNP Rice/NNP ,/, who/WP | *T*-100/NN->-NONE- | had/VBD discovered/VBN th
VBD discovered/VBN the/DT | crib/JJ->NN | notes/NNS ./.
``/`` We/PRP | work/NN->VBP | damn/RB hard/RB at/IN wha
``/`` We/PRP work/VBP | damn/NN->RB | hard/RB at/IN what/WP we/
/IN what/WP we/PRP do/VBP | *T*-101/NN->-NONE- | for/IN damn/RB little/JJ
VBP *T*-101/-NONE- for/IN | damn/NN->RB | little/JJ pay/NN ,/, and/
...

至此,我们就解决了最初的问题~

赶在双十一的尾巴总结一下这个困扰我两三个小时的问题,希望对后来者有帮助~


推荐阅读
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 标题: ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
广东庚舞飞扬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有