前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AI 程序员跨环境执法宝典

AI 程序员跨环境执法宝典

作者头像
爱吃大橘
发布2023-10-16 15:23:54
3610
发布2023-10-16 15:23:54
举报
文章被收录于专栏:前端笔记薄前端笔记薄

前言

本文涉及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 .\day02\nltk.py Traceback (most recent call last): File ".\day02\nltk.py", line 1, in import nltk File "..\slice_word\day02\nltk.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 .\day02\nltkDownload.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_data\taggers\averaged_perceptron_tagger”目录下。在Linux或macOS上,数据文件应该位于“/usr/local/share/nltk_data/taggers/averaged_perceptron_tagger”目录下。 请注意,你需要使用管理员权限来移动文件到这些目录。如果你无法使用管理员权限,请将数据文件放在你有权限访问的其他目录下,并在代码中指定正确的路径。

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

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

最后成功后,输入如下

python.exe .\day02\nltkDownload.py [nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] C:\Users\99563\AppData\Roaming\nltk_data... [nltk_data] Unzipping taggers\averaged_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必将取代大部分工作)。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • GitHub Copilot指点的大纲
    • 读取小说文本文件,将其转换为字符串
      • 使用jieba分词将文本分成单词
        • 使用词性标注工具(如NLTK)标注每个单词的词性。
          • GitHub Copilot故障:查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。
            • 后面就是我发动chatGPT做的了,copilot大纲不用了
              • chatGPT:查找包含“姓”字的单词,将其后面的一个单词作为名字的一部分。
                • 判断是否是名字
                • 总结一下:
                  • 优点:
                    • 缺点
                      • 最后
                      相关产品与服务
                      NLP 服务
                      NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档