前言
本文涉及AI工具有 github copilot chat 和 chatGPT。
核心观点,AI是程序员跨环境执法好帮手。之前我了解一门语言。到用它做些什么需要一周,现在立刻马上。
因为AI是我司程序员必须了解的一项,所以我做了这个文章,分享我的使用过程,希望能帮你少走弯路
GitHub Copilot指点的大纲
先用chatgpt来一个大概的步骤
获取小说中人物的名字是一个比较复杂的任务,需要使用自然语言处理技术。下面是一个简单的思路,可以用Python实现:
-
读取小说文本文件,将其转换为字符串。
-
使用jieba分词将文本分成单词。
-
使用词性标注工具(如NLTK)标注每个单词的词性。
-
查找包含"姓"字的单词,将其后面的一个单词作为名字的一部分。
-
查找"先生"和"女士"这两个词,将其前面的一个单词作为名字的一部分。
-
将所有名字保存到一个列表中,去除重复的名字。
-
对名字列表进行排序,输出结果。
读取小说文本文件,将其转换为字符串
这个思路只是一个简单的示例,实际上获取小说中人物的名字是一个非常复杂的任务,需要考虑到很多细节。如果你需要更详细的帮助,请提供更多的信息,例如小说的格式、语言等。
python
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来安装,打开终端或命令行窗口,输入以下命令:
pip install jieba
pip install nltk
arduino
import nltk
nltk.download('averaged_perceptron_tagger')
但是遇到报错
直接复制粘贴问chatGpt
第一个报错:
java
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",然后再次运行代码。
回答中规中矩
第二个报错:
ini
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)标注每个单词的词性。
ini
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进行中文词性标注的示例代码:
ini
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)
然后得到输出结果:
我_r 爱_v 自然_n 语言_n 处理_v
这回准确了,第一个元组是('我', 'r'),它表示单词"我"的词性标记是"r",即代词。第二个元组是('爱', 'v'),它表示单词"爱"的词性标记是"v",即动词。第三个元组是('自然', 'n'),它表示单词"自然"的词性标记是"n",即名词。第四个元组是('语言', 'n'),它表示单词"语言"的词性标记是"n",即名词。最后一个元组是('处理', 'v'),它表示单词"处理"的词性标记是"v",即动词。
总结一下:
标注词性 中文用 thulac ,英文用nltk
但是,thulac解析也是分词。。。那jieba(那我走。。。)
GitHub Copilot故障:查找包含"姓"字的单词,将其后面的一个单词作为名字的一部分。
ini
# 读取小说文本文件,将其转换为字符串。
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:查找包含"姓"字的单词,将其后面的一个单词作为名字的一部分。
同样的问题结果如下:
csharp
# -*- 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库也可以标注词性,代码如下
ini
import jieba.posseg as pseg
# 定义一个中文句子。
text = '我爱自然语言处理'
# 使用jieba的分词函数将句子分成单词,并使用词性标注函数标注每个单词的词性。
words = pseg.cut(text)
# 输出结果。
for word, flag in words:
print(word, flag)
最终输出结果如下:
ini
# -*- 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必将取代大部分工作)。
我会继续探索它的能力,如果有什么新的发现,我会在这里更新的。
相关链接: 从文章中提取人物姓名(------):juejin.cn/post/724860...