AI 程序员跨环境执法宝典

2023-10-16 15:23:54 浏览数 (1)

前言

本文涉及AI工具有 github copilot chat 和 chatGPT。

核心观点,AI是程序员跨环境执法好帮手。之前我了解一门语言。到用它做些什么需要一周,现在立刻马上。

因为AI是我司程序员必须了解的一项,所以我做了这个文章,分享我的使用过程,希望能帮你少走弯路

GitHub Copilot指点的大纲

先用chatgpt来一个大概的步骤

获取小说中人物的名字是一个比较复杂的任务,需要使用自然语言处理技术。下面是一个简单的思路,可以用Python实现:

  • 读取小说文本文件,将其转换为字符串。
  • 使用jieba分词将文本分成单词。
  • 使用词性标注工具(如NLTK)标注每个单词的词性。
  • 查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。
  • 查找“先生”和“女士”这两个词,将其前面的一个单词作为名字的一部分。
  • 将所有名字保存到一个列表中,去除重复的名字。
  • 对名字列表进行排序,输出结果。

读取小说文本文件,将其转换为字符串

这个思路只是一个简单的示例,实际上获取小说中人物的名字是一个非常复杂的任务,需要考虑到很多细节。如果你需要更详细的帮助,请提供更多的信息,例如小说的格式、语言等。

代码语言:javascript复制
with open('./day02/novel.txt', 'r', encoding='utf-8') as f:
    text = f.read()

print(text)

使用jieba分词将文本分成单词

jieba本身并不提供词性标注功能,但是可以通过结合其他工具来实现。常用的词性标注工具有NLTK、Stanford CoreNLP等。这里以NLTK为例,介绍如何使用jieba和NLTK结合来进行词性标注。

首先,你需要安装NLTK库。你可以使用pip来安装,打开终端或命令行窗口,输入以下命令:

代码语言:javascript复制
pip install jieba
pip install nltk
代码语言:javascript复制
import nltk
nltk.download('averaged_perceptron_tagger')

但是遇到报错

直接复制粘贴问chatGpt

第一个报错:

代码语言:javascript复制
pip install nltk
python.exe .day02nltk.py Traceback (most recent call last): File ".day02nltk.py", line 1, in import nltk File "..slice_wordday02nltk.py", line 2, in nltk.download('averaged_perceptron_tagger') AttributeError: partially initialized module 'nltk' has no attribute 'download' (most likely due to a circular import)

GitHub Copilot: 这个错误可能是因为你的Python文件名与NLTK模块名重复了,导致了循环导入。请尝试将你的Python文件重命名为其他名称,例如“my_nltk.py”,然后再次运行代码。

回答中规中矩

第二个报错:

代码语言:javascript复制
python.exe .day02nltkDownload.py [nltk_data] Error loading averaged_perceptron_tagger: <urlopen error [nltk_data] [Errno 2] No such file or directory>

GitHub Copilot: 这个错误可能是因为你的计算机无法连接到NLTK数据服务器。你可以尝试手动下载数据并将其放在正确的位置。具体步骤如下:

打开Python解释器,输入以下命令: 其中,download_dir参数是你想要下载数据的目录。请将其替换为你实际使用的目录。

下载完成后,你需要将数据文件移动到正确的位置。在Windows上,数据文件应该位于“C:nltk_datataggersaveraged_perceptron_tagger”目录下。在Linux或macOS上,数据文件应该位于“/usr/local/share/nltk_data/taggers/averaged_perceptron_tagger”目录下。 请注意,你需要使用管理员权限来移动文件到这些目录。如果你无法使用管理员权限,请将数据文件放在你有权限访问的其他目录下,并在代码中指定正确的路径。

这回回答停车的但是吧,我试了一下,C:nltk_datataggersaveraged_perceptron_tagger 路径为空。。。

感觉不太行吧,我最后选科学上网。。。

最后成功后,输入如下

python.exe .day02nltkDownload.py [nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] C:Users99563AppDataRoamingnltk_data... [nltk_data] Unzipping taggersaveraged_perceptron_tagger.zip.

GitHub Copilot: 好的,看起来你已经成功下载了NLTK的数据。现在你可以使用jieba和NLTK结合来进行词性标注了。请参考我之前的回答,使用以下代码进行词性标注:

使用词性标注工具(如NLTK)标注每个单词的词性。

代码语言:javascript复制
import nltk

text = '我爱自然语言处理'
words = jieba.lcut(text)
tags = nltk.pos_tag(words)

print(tags)

输出如下

[('我', 'JJ'), ('爱', 'NNP'), ('自然语言', 'NNP'), ('处理', 'NN')]

第一个元组是('我', 'JJ'),它表示单词“我”的词性标记是“JJ”,即形容词。第二个元组是('爱', 'NNP'),它表示单词“爱”的词性标记是“NNP”,即专有名词。第三个元组是('自然语言', 'NNP'),它表示单词“自然语言”的词性标记是“NNP”,即专有名词。最后一个元组是('处理', 'NN'),它表示单词“处理”的词性标记是“NN”,即名词。

然后我就疑惑,为什么不对?

为什么nltk的解释并不准确,他的结果如下 [('我', 'JJ'), ('爱', 'NNP'), ('自然语言', 'NNP'), ('处理', 'NN')]

你有什么建议,可以让我获得准确的词性吗

GitHub Copilot:

NLTK的词性标注器使用的是英文的词性标注体系,而不是中文的词性标注体系。因此,它对中文文本的词性标注可能不太准确。

如果你想要获得更准确的中文词性标注,可以考虑使用其他中文词性标注工具,例如THULAC、HanLP等。这些工具都是专门为中文文本设计的,可以提供更准确的词性标注结果。

下面是一个使用THULAC进行中文词性标注的示例代码:

代码语言:javascript复制
import thulac

# 读取小说文本文件,将其转换为字符串。
with open('./day02/novel.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 使用THULAC进行中文分词和词性标注。
thu = thulac.thulac()
result = thu.cut(text, text=True)

# 输出结果。
print(result)

然后得到输出结果:

代码语言:javascript复制
我_r 爱_v 自然_n 语言_n 处理_v

这回准确了,第一个元组是('我', 'r'),它表示单词“我”的词性标记是“r”,即代词。第二个元组是('爱', 'v'),它表示单词“爱”的词性标记是“v”,即动词。第三个元组是('自然', 'n'),它表示单词“自然”的词性标记是“n”,即名词。第四个元组是('语言', 'n'),它表示单词“语言”的词性标记是“n”,即名词。最后一个元组是('处理', 'v'),它表示单词“处理”的词性标记是“v”,即动词。

总结一下:

标注词性 中文用 thulac ,英文用nltk

但是,thulac解析也是分词。。。那jieba(那我走。。。)

GitHub Copilot故障:查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。

代码语言:javascript复制
# 读取小说文本文件,将其转换为字符串。
with open('./day02/novel.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 使用jieba分词将文本分成单词。
import jieba
words = jieba.lcut(text)

# 查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。
names = []
for i in range(len(words)):
    if words[i] == '姓':
        if i 1 < len(words):
            name = words[i]   words[i 1]
            if name not in names:
                names.append(name)

# 将所有名字保存到一个列表中,去除重复的名字。
names = list(set(names))

# 对名字列表进行排序,输出结果。
names.sort()
print(names)

这个明显不对,在我的提示下:

“这个姓 是百家姓的意思, 可以 是 赵钱孙李等一百多个姓”

GitHub Copilot正准备给出了正确的代码,结果Oops, your response got filtered. Vote down if you think this shouldn't have happened。

好吧短点,“这个姓 是百家姓的意思, 可以 是 赵钱孙李等”,结果依然Oops, your response got filtered. Vote down if you think this shouldn't have happened.

看来github copilot还是有点问题的,我就自己找chatGPT。

后面就是我发动chatGPT做的了,copilot大纲不用了

chatGPT:查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。

同样的问题结果如下:

代码语言:javascript复制
# -*- coding: utf-8 -*-
# 读取小说文本文件
import jieba
import jieba.posseg as pseg

with open('./day01/名人传记62本(合集)_001.txt', 'r', encoding='utf-8') as f:
# with open('C:\Users\99563\Documents\BaiduSyncdisk\电子书\起点总推荐排行榜1-120名小说\009.斗罗大陆.txt', 'r', encoding='utf-8') as f:
# with open('./day02/novel.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 使用jieba分词将文本分成单词
words = jieba.lcut(text)
print(words)

# 定义百家姓列表

surnames = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁']

# 查找包含百家姓的单词,将其后面的一个单词作为名字的一部分
fiterWords = []
for i in range(len(words)):
    if words[i][0] in surnames:
        fiterWords.append(words[i])

# 去除重复的名字
fiterWords = list(set(fiterWords))

# 对名字列表进行排序,输出结果
fiterWords.sort()
print(fiterWords)

判断是否是名字

其实jieba库也可以标注词性,代码如下

代码语言:javascript复制
import jieba.posseg as pseg

# 定义一个中文句子。
text = '我爱自然语言处理'

# 使用jieba的分词函数将句子分成单词,并使用词性标注函数标注每个单词的词性。
words = pseg.cut(text)

# 输出结果。
for word, flag in words:
    print(word, flag)

最终输出结果如下:

代码语言:javascript复制
# -*- coding: utf-8 -*-
# 读取小说文本文件
import jieba
import jieba.posseg as pseg

with open('./day01/名人传记62本(合集)_001.txt', 'r', encoding='utf-8') as f:
# with open('C:\Users\99563\Documents\BaiduSyncdisk\电子书\起点总推荐排行榜1-120名小说\009.斗罗大陆.txt', 'r', encoding='utf-8') as f:
# with open('./day02/novel.txt', 'r', encoding='utf-8') as f:
    text = f.read()

# 使用jieba分词将文本分成单词
words = jieba.lcut(text)
print(words)

# 定义百家姓列表

surnames = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史', '唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅', '皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁']

# 查找包含百家姓的单词,将其后面的一个单词作为名字的一部分
fiterWords = []
for i in range(len(words)):
    if words[i][0] in surnames:
        fiterWords.append(words[i])

# 去除重复的名字
fiterWords = list(set(fiterWords))

# 对名字列表进行排序,输出结果
fiterWords.sort()
print(fiterWords)

names = []
for i in range(len(fiterWords)):
    # 定义一个单词。
    word = fiterWords[i]
    # 使用NLTK的命名实体识别函数标注单词的命名实体类型。
    result = pseg.cut(word)
    # 判断单词的词性是否为人名。
    for word, flag in result:
        if flag == 'nr':
            names.append(word)
            # print('是人名')
        # else:
            # print('不是人名')

print(names)

总结一下:

github copilot像是一个小助手,表现还是不错,但不完善。

优点:

对于写代码而言,常见的,不复杂的,有公开资料的功能和场景,表现都还好。

  • 初学者导师:对于初学者,他的回答很有帮助,比如说,你不知道如何使用jieba,他就会给你推荐jieba,然后你就可以使用jieba了。
  • 报错建议:当你需要如何解决一个具体的(常见)报错,一下子就出来了,节省了一些时间。
  • 写算法题,对于人比较烧脑的但(常见)算法,对于他只是背写,有不错的表现。

缺点

但是它的缺点也很明显,不可靠,有时候会出现错误的提示,比如说,我想要一个词性标注的功能,他给我推荐了一个jieba,但是他以为jieba并没有词性标注的功能。推荐jieba和nltk一起使用,但是nltk并不支持中文词性标注,这个时候,他就会给出错误的提示。他会漏掉一些关键因素。

  • 写出的代码有些时候,也不能一次到位,需要多次调试。。。
  • 具体到某些不常见的针对性场景,他的回答很堪忧。。。
  • 需要人靠自己的思考一步步引导,更像是搜索工具。但是,我都一步步引导了,对于老手而言,他的回答就显得多余了。
  • 有些时候字数限制极为恶心。

最后

AI 目前虽然有一些问题,但确实越来越好用了,我们需要主动探索,挑战,而不能因为其不成熟而放弃。

当一个AI工具不行的时候,不妨试试其他工具,也思考一下为什么不行。在这个过程,就算是失败了,也是一种收获了宝贵的认知(因为AI必将取代大部分工作)。

我会继续探索它的能力,如果有什么新的发现,我会在这里更新的。

0 人点赞