欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

何老师《自然语言处理入门》关于直接运行zipf_law.py会提示No module named ‘tests.test_utility’?

程序员文章站 2022-05-09 13:29:54
...

[请教:为什么直接运行

会提示No module named ‘tests.test_utility’?](https://bbs.hankcs.com/t/topic/79)
看到有人在bbs上问这个问题,而回答问题的很多答主都没有真正解决提问者的问题,主要提到的是添加python包路径,需要注意的是,路径需要设置到tests所在的上一目录,即如下图所示,设置到code目录即可,不然的话,会出现找不到包tests
何老师《自然语言处理入门》关于直接运行zipf_law.py会提示No module named ‘tests.test_utility’?

其实除此之外,很多人添加了还是发现无法使用tests包,为什么呢?因为还可能存在另一个问题。
何老师《自然语言处理入门》关于直接运行zipf_law.py会提示No module named ‘tests.test_utility’?
可以查看tests目录下的__init__.py文件,而普通目录和python包最大的不同就在于此,这个文件的作用是:当用 import 导入该目录时,会执行 init.py 里面的代码,而很明显可以看到,这里源代码中是没有写__init__.py的,因此,我们只需要把其完善即可,这样就可以直接调用

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-06-03 19:15

# Author: BugII
# Date: 2021-11-10 20:32
# 直接用何老师的包会报错,原因是因为没有写好tests包的__init__.py,导致即便添加了路径也找不到对应的文件

from .test_custom_dict import *
from .test_hanlp import *
from .test_multithread import *
from .test_utility import *
from .test_word2vec import *

后面经实验发现,其实不加上也可以,因为就在tests的目录下,索引的时候还是可以直接找到(以上方法仅供屡次不成功的参考)

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x9c in position 2: illegal multibyte sequence

TypeError: a bytes-like object is required, not ‘str’

此外,这个zipf_law.py还不能直接跑通,主要出现以上两个问题,处理如下代码所示

f = Counter()
with open(msr, 'rb') as src:	# 加'rb', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence 
    for line in src:
        # TypeError: a bytes-like object is required, not 'str'
        # 需要解码
        line = line.decode()    
        line = line.strip()
        for word in line.split('  '):
            # word = word.strip()
            # if len(word) < 2: continue
            f[word] += 1

或者由于他提示不能用gbk,那么指定编码方式就行

f = Counter()
with open(msr, encoding="utf-8") as src:	# 加'encoding', UnicodeDecodeError: 'gbk' codec can't decode byte 0x9c in position 2: illegal multibyte sequence 
    for line in src:
        line = line.strip()
        for word in line.split('  '):
            # word = word.strip()
            # if len(word) < 2: continue
            f[word] += 1