用Python编写,抖音文本程序编写文件中存储了姓名和性别,写一个程序实现随机获取两个不同性别的姓名(匹配抽奖游戏)

用python写一个录音小工具 - 简书
用python写一个录音小工具
Python的paramiko,wxPython库的应用
Sound eXchange 命令行
最近在给一个做语音识别的项目做QA工作。众所周知,此类人工智能方面的项目都需要一些数据收集的工作。作为一个比较小型的团队,暂时还没有使用外包团队来做大量的数据,前期数据来源都是团队内的同事录音。
我们的录音工具是树莓派+麦克风阵列,通过ssh,可以用电脑操作树莓派开始录音和停止录音。虽然从QA的角度来说,操作非常固定,但是团队同事有近一半同事不是程序猿,看到secureCRT这么恐怖的界面(此处应有图)大多还是有心理障碍。
所以为了提升用户体验(其实是没有工具就得我一个人来录了),用python做了个简单的工具,达到了点点就能用效果。顺带还整合了两三波新的需求
可以从语料库中随机出一句话,展示在界面上给朗读人看
可以点击按钮开始录音,点击按钮结束录音。留了一个取消录音功能防止嘴飘。
有一些环境参数(性别,安静环境/嘈杂环境,距离等)可以手动填入
结束录音后可以按照格式保存为xxxx.wav文件
支持播放已有语音的功能,用于做环境噪音合成
麦克风阵列通过USB连接到树莓派,树莓派通过无线连接到插在电脑上的360随身wifi上。PC通过secureCRT或者mac的ssh语句可以远程到树莓派上执行指令。
连上以后执行下述命令即可开始录音。
$arecord -D "plughw:1,0" -r 16000 -c 10 -f S16_LE test.wav
录音指令是阻塞的,ctrl+C停止录音。
Version.1 Flask + paramiko
第一个版本就是基于上述原理的。而且因为要做个界面,所以就选了比较熟悉的Bootstrap做网页,Flask做后端,通过paramiko来执行操作。
paramiko创建ssh连接的方式如下:
import paramiko
IP = "xxx.xxx.xxx.xxx"
USERNAME = "user"
PASSWORD = "pwd"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(IP, PORT, USERNAME, PASSWORD)
paramiko中执行指令的类有2个,一个是上述代码中的ssh,可以用stdin, stdout, stderr = ssh.exec_command(cmd)来执行cmd指令,还有一个是可以用channel来执行。
chan = ssh.get_Transport().open_session()
chan = send(cmd)
str = chan.recv(recv_buffer)
考虑到上述录音指令是阻塞的,因此如果采用ssh.exec_command(cmd)没有办法通过ctrl+C来停止录音。因此考虑采用channel.send的方法。ctrl+C可以用channel.send('\x03')来执行。
但是各种花式调用以后,一直都没能停掉录音的进程,原因不明。
因此尝试了一下直接kill掉进程可以保存数据以后,选择了简单粗暴地kill掉arecord所在进程的方法。那么接下来的问题就是获取arecord所在进程id的方法了。
执行$ps -ef | grep \"arecord\" | grep -v grep | awk '{print $2}'可以获取到arecord所在进程pid,再拼接指令$kill -9 xxxx即可杀掉进程。
前端其实没啥好说,提交表单,ajax刷新页面。不过之前其实也没有写过ajax的get方法,所以记录一下
function randomclick(){
$.get("/random", function(data){document.getElementById('scentence').innerHTML =})
解决了上述执行指令的问题以后,基本就是给网页提供接口了。除了随机语句的功能以外,就是
开始录音:执行录音语句
结束录音:结束录音进程,并将语音文件重命名为指定格式的wav文件
取消录音:结束录音进程,删除临时语音文件
Version.2 wxPython+sox
后来因为有了新的需求,主要是播放wav文件和文件命名优化。回过头来看了看,觉得这种需求做成网页其实是不大合适的,毕竟根本没法处理并发的情况。所以决定用python的UI库来做成一个小工具。
之前用过python的pyqt库,但是不知道为什么安装不上pyqt(我觉得就是那阵特别不顺,没别的!),于是换成了wxPython。后来发现wxPython的media还自带音频播放功能。
大概描述一下需求吧
文本展示框,附带2个功能按钮,只改变该文本框的内容
退出时保存一些运行信息到文件中
几个信息输入框,可能有select,也有可能有文本输入
开始录音、结束录音和取消录音按钮
选择播放录音目录的按钮和播放录音的按钮
接下来就一个一个需求点来说吧
文本展示框
sentence = wx.TextCtrl(self, style = wx.TE_MULTILINE, size = (xx, xx))
sentence.SetValue(str)
str = sentence.GetValue()
style = wx.TE_MULTILINE表示该文本框为多行文本框,会自动换行。默认为单行文本框。可以用SetValue方法设置其值,也可以用GetValue来读取文本框的值。
退出时保存信息
def __init__(self, parent, title)
self.Bind(wx.EVT_CLOSE, self.onExit, parent)
def onExit(self, evt):
evt.Skip()
在init函数中通过self.Bind将wx.EVT_CLOSE事件绑定到self.onExit函数上。
在self.onExit函数中将运行时的参数保存于文档中。
注意最后需要evt.Skip()来执行关闭界面的功能
特别需要注意的是,当前类需要继承wx.Frame才能使得关闭界面与当前类的wx.EVT_CLOSE事件绑定。
category_list = ["男", "女"]
classify = wx.Choice(self, -1, choices=category_list, size = (100, 48))
classify.SetSelection(0)
wx.Choice组件需要提供下拉选择列表,比如category_list,可以用SetSelection(idx)将列表中的idx项设为默认值。如果没有设定默认值,默认显示为空。
目录选择按钮
def onClickSelectDir(self, evt):
dlg = wx.DirDialog(self, "Choose a directory:")
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.updatelist(path)
dlg.Destroy()
将目录选择按钮的wx.EVT_BUTTON绑定至onClickSelectDir函数上。通过path = dlg.GetPath()获取到选择的目录以后,执行自定义的updatelist(path)来完成保存数据的功能。
def __init__(self, parent, title):
self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER)
except NotImplementedError:
self.Destroy()
self.Bind(EVT_BUTTON, onPlay, playbutton)
def onPlay(self, evt):
self.mc.Load(self.filename)
time.sleep(0.5)
self.mc.Play()
在init中定义MediaCtrl控件
把playbutton的点击事件和onPlay函数绑定
onPlay函数中,首先用MediaCtrl组件的Load函数加载媒体文件,sleep(0.5)后执行Play函数。
其实这种写法并不是非常专业,之前调研的结果是需要处理EVT_MEDIA_LOADED事件,但是尝试发现将此事件与函数绑定后并未触发该事件,因此简单粗暴sleep解决。
不写文章时很少在线。
----------
一曲琴箫远天涯
Forever Mayday.
----------
未来不迎,过往不恋。
这是一个用于iOS开发的各种开源库、开源资料、开源技术等等的索引库.转载自:https://github.com/Tim9Liu9/TimLiu-iOSgithub排名 https://github.com/trendinggithub搜索:https://github.c...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
第一章1.设计现代OS的主要目标是什么?答:(1)有效性 (2)方便性 (3)可扩充性 (4)开放性2.OS的作用可表现在哪几个方面?答:(1)OS作为用户与计算机硬件系统之间的接口(2)OS作为计算机系统资源的管理者(3)OS实现了对计算机资源的抽象3.为什么说OS实现了...
TimLiu-iOS 目录 UI下拉刷新模糊效果AutoLayout富文本图表表相关与Tabbar隐藏与显示HUD与Toast对话框其他UI 动画侧滑与右滑返回手势gif动画其他动画 网络相关网络连接图像获取网络聊天网络测试网页框架WebView与WKWebView Mod...
微信小程序在无论在功能、文档及相关支持方面,都是优于前面几种微信账号类型,它提供了很多原生程序才有的接口,使得我们的小程序在很多方面突破H5页面应用的限制,更加接近原生程序的功能,因此微信小程序具有很大的前景想象力。它提供了自己的视图层描述语言WXML和WXSS,以及基于J...
往事并不如烟 它甚至孤单的很可怜 像一阵风 越过山林,穿过河谷 趟过清湍,跨过峡渊 从清晨到黄昏 从太阳落下到月亮升起 从一个秋天到另一个秋天
光阴单薄 春日漂泊 它从不曾跌入尘土 一直干干净净 这个世界不是孤独荒野 也不是四季流星的璀璨星空
我是集市里...
花了一上午时间,看完WWDC2016中UICollectionView相关内容 参考自:What's New in UICollectionView in iOS 10 简单总结: 1.UICollectionView、UITableView修改了cell的生命周期,增加了...
关键词,香港,住房。 百度关键词之后,发现这类新闻很多。 看了新闻之后,除了叹息一声,香港人真苦逼,住房真艰苦之后,之后又想到了什么? 当然是—— 我们不要过这样的生活! 其实我住过类似的房子。只有一张床,然后一盏吊灯,一扇门,其他什么都没有。 但是相比这些“棺材”,那个房...
早起与反思是最佳拍档,比其他人的作息早一个小时,无论是早上还是晚上,找一个安静的时间,白天找一个时间点真的是蛮难的,日记用手机的软件写,一天的事用日历软件和清单软件记录,一件事用清单软件记录,人生的反思问6个问句也记录在软件当中,所以要把手机软件充分利用起来。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Python NLTK学习7(对中文昵称进行性别分类)
摘要:发表于:6天前阅读:226本系列博客为学习《用Python进行自然语言处理》一书的学习笔记。引言分类就是对事物进行归类,举个栗子:男人站左边,女人站右边,人妖站中间。文本分类就是对文本进行归类,举个栗子:垃圾邮件过滤。那么程序是如何分辨出一个邮件是垃圾邮件还是普通邮件的呢?这个问题可以类比于别人问你如何分辨一个人是男人还是女人,你可能会说:男人有胡子,女人没胡子,男人皮肤粗糙,女人皮肤细腻等等。有胡子,皮肤粗糙这是一个人的一些特征,我们可以根据一个人的一些特征来分辨他(她)的
发表于:6天前阅读:226
本系列博客为学习《用Python进行自然语言处理》一书的学习笔记。
分类就是对事物进行归类,举个栗子:男人站左边,女人站右边,人妖站中间。文本分类就是对文本进行归类,举个栗子:垃圾邮件过滤。
那么程序是如何分辨出一个邮件是垃圾邮件还是普通邮件的呢? 这个问题可以类比于别人问你如何分辨一个人是男人还是女人,你可能会说:男人有胡子,女人没胡子,男人皮肤粗糙,女人皮肤细腻等等。有胡子,皮肤粗糙这是一个人的一些特征,我们可以根据一个人的一些特征来分辨他(她)的性别,同理我们也可以根据一封邮件的特征来分辨它是否是垃圾邮件。人的特征好理解,那么一封邮件的特征是什么呢?邮件就是一段文本,一段文本的特征就是里面包含的单词。但是不是所有的单词(特征)都对我们的分类有帮助呢?答案是否定的,就好像一个人的其中一个特征是说东北话,这个特征对我们性别分辨就没有帮助,所以要挑选有用的特征。
解决了特征的问题你可能会问:男人有胡子,女人没胡子这种判断是你妈妈告诉你的,那么程序的判断依据是什么呢?这其实是模型的问题,男人有胡子这种模型可能是你妈妈告诉你的,或者你自己观察总结出来的。针对邮件分类,我们很难直接给出一个模型。但是我们可以对大量的已经分类好的邮件数据集使用机器学习算法来生成这种模型。
以上其实就是一个有监督分类,有监督分类的框架如下图:
接下来我们会分别对英文姓名和中文昵称做性别分类。
性别鉴定(英文)
根据上面的模型我们可以考虑根据人名(英文)来预测人的性别。
先写一个特征提取函数,这个特征提取函数只把人名的最后一个字母最为特征:
def gender_feature(name):
return {'last_letter': name[-1]}
获取训练和测试使用的数据集,NLTK中有一个姓名的语料库names,它分别收集了大约5000个女性人名和3000个男性人名:
import nltk
import random
from nltk.corpus import names
# 获取名字,性别数据列表
male_names = [(name, 'male') for name in names.words('male.txt')]
female_names = [(name, 'female') for name in names.words('female.txt')]
total_names = male_names + female_names
random.shuffle(total_names)
# 生成性别特征集
feature_set = [(gender_feature(n), g) for (n, g) in total_names]
# 将特征集拆分为训练集和测试集
train_set_size = int(len(feature_set) * 0.6)
train_set = feature_set[:train_set_size]
test_set = feature_set[:train_set_size]
使用朴素贝叶斯分类器训练模型,对人名'Neo'进行鉴定并且使用测试集测试模型的准确度:
classifier = nltk.NaiveBayesClassifier.train(train_set)
print(classifier.classify(gender_feature('Neo')))
print(nltk.classify.accuracy(classifier, test_set))
我们可以看到'Neo'被正确的分类为男性,关于朴素贝叶斯分类器的具体实现,我们以后再介绍。我们还可以检查分类器,看看姓名中哪些特征值对区分性别是最有效的:
classifier.show_most_informative_features()
Most Informative Features
last_letter = 'a' female : male = 30.1 : 1.0
last_letter = 'k' male : female = 19.5 : 1.0
last_letter = 'f' male : female = 16.7 : 1.0
last_letter = 'p' male : female = 9.8 : 1.0
last_letter = 'o' male : female = 9.6 : 1.0
last_letter = 'd' male : female = 9.3 : 1.0
last_letter = 'm' male : female = 8.3 : 1.0
last_letter = 'g' male : female = 7.4 : 1.0
last_letter = 'v' male : female = 7.3 : 1.0
last_letter = 'w' male : female = 6.6 : 1.0
我们可以看到最后字母为a的人名女性的概率是男性的30倍,最后字母为k的人名男性的概率是女性的20倍。
性别鉴定(中文)
上面我们针对英文姓名做性别判定,现在我们针对中文昵称做性别判定。NLTK中没有中文的昵称语料库,只能我们自己收集。笔者通过新浪微博,收集到大约5000个男性昵称和5000个女性昵称。点击下面的链接,大家就可以在浏览器中看到昵称数据,右击另存为就可以保存数据。
将下载好的昵称数据保存在工作目录下,然后加载数据。加载数据需要使用到PlaintextCorpusReader类,它的构造函数的第一个参数用于指定数据文件所在目录,第二个参数用于指定数据文件名:
import nltk
import random
from nltk.classify import apply_features
from nltk.corpus import PlaintextCorpusReader
names_corpus = PlaintextCorpusReader('./', ['female.txt', 'male.txt'])
all_names = names_corpus.words()
现在我们需要考虑昵称的特征,我们可以为每个字定义一个特性表示该昵称是否包含该字。为了限制特征的数目,我们可以只考虑整个昵称数据中最频繁使用的字,所以我们把昵称中最频繁出现的1000个字作为特征:
ch_freq = nltk.FreqDist(ch.lower() for name in all_names for ch in name)
ch_freq_most = ch_freq.most_common(1000)
ch_features = [ch for (ch, count) in ch_freq_most]
打印看看哪些字是最频繁的:
print(ch_freq_most)
[('a', 1992), ('e', 1836), ('i', 1704), ('n', 1580), ('o', 1371), ('s', 1070), ('l', 1057), ('r', 1055), ('_', 814), ('c', 805), ('t', 793), ('m', 740), ('y', 737), ('-', 700), ('h', 677), ('u', 652), ('小', 626), ('g', 581), ('的', 518), ('d', 493), ('k', 413), ('大', 413), ...]
从结果中我们可以看到一些常见的英文或中文字符。接下来我们写一个特征提取函数:
def name_features(name):
名称特征提取
:param name: 名称
:return: 名称特征
name_chs = set([ch.lower() for ch in name])
features = {}
for ch in ch_features:
features['contain(%s)' % ch] = (ch in name_chs)
return features
构建训练数据集和测试数据集,因为数据集稍微有点大,我们使用生成器来构建训练集和测试集:
female_names = [(name, 'female')for name in names_corpus.words('female.txt')]
male_names = [(name, 'male')for name in names_corpus.words('male.txt')]
total_names = female_names + male_names
random.shuffle(total_names)
train_set_size = int(len(total_names) * 0.6)
train_names = total_names[:train_set_size]
test_names = total_names[train_set_size:]
train_set = apply_features(name_features, train_names, True)
test_set = apply_features(name_features, test_names, True)
使用贝叶斯分类器训练模型:
classifier = nltk.NaiveBayesClassifier.train(train_set)
查看分类器在训练集上和测试集上的正确率:
print(nltk.classify.accuracy(classifier, train_set))
print(nltk.classify.accuracy(classifier, test_set))
可以看到我们训练的模型在测试集上正确率不太高,可能是训练数据太少或其他原因。我们可以先看看哪些特征字对性别区分有帮助:
classifier.show_most_informative_features(20)
Most Informative Features
contain(娜) = True female : male = 12.8 : 1.0
contain(姐) = True female : male = 12.5 : 1.0
contain(女) = True female : male = 11.9 : 1.0
contain(浩) = True male : female = 11.7 : 1.0
contain(娘) = True female : male = 11.3 : 1.0
contain(伊) = True female : male = 11.3 : 1.0
contain(丽) = True female : male = 10.1 : 1.0
contain(颖) = True female : male = 8.1 : 1.0
contain(妍) = True female : male = 8.1 : 1.0
contain(股) = True male : female = 7.7 : 1.0
contain(妈) = True female : male = 7.5 : 1.0
contain(杰) = True male : female = 7.4 : 1.0
contain(仙) = True female : male = 7.4 : 1.0
contain(鸡) = True female : male = 7.4 : 1.0
contain(琳) = True female : male = 7.2 : 1.0
contain(刚) = True male : female = 7.2 : 1.0
contain(雅) = True female : male = 7.2 : 1.0
contain(男) = True male : female = 7.0 : 1.0
contain(酱) = True female : male = 6.8 : 1.0
contain(伟) = True male : female = 6.7 : 1.0
我们可以看到包含'娜' '姐' '女' '娘'的昵称是女性的概率比较高,包含'浩' '杰' '刚'的昵称是男性的概率比较高,这也符合我们的认知。我们来看看我们把哪些昵称分错了:
for (name, tag) in test_names:
guess = classifier.classify(name_features(name))
if guess != tag:
print(tag, guess, name)
male female 痞子梦
male female Misaya若风lol
female male LISA中文首站
male female Miyavirolling
male female 没关系是搞笑啊
male female Silk_River_Research
female male 阿狮狮
female male BTV跨界喜剧王
female male 神迷电影
male female 顶层分享
微博很多用户代表的是商家或单位,它们的昵称给我们带来困扰,如BTV跨界喜剧王、顶层分享等,可能我们需要做数据清洗。
NaiveBayesClassifier::train(labeled_featuresets) :训练模型,接受被标签的特征集,返回一个朴素贝叶斯分类器对象
NaiveBayesClassifier::classify(feature) :分类,接受特征,返回标签
NaiveBayesClassifier::show_most_informative_features(N) :打印最有用的前N个特征
classify.accuracy(classifier, gold) :计算分类器的正确率
其他章节链接
Python NLTK学习1(Text对象)
Python NLTK学习2(FreqDist对象)
Python NLTK学习3(语料库)
Python NLTK学习4(条件频率分布)
Python NLTK学习5(词性标注)
Python NLTK学习6(创建词性标注器)
Python NLTK学习7(对中文昵称进行性别分类)
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Python NLTK学习7(对中文昵称进行性别分类)相关信息,包括
的信息,所有Python NLTK学习7(对中文昵称进行性别分类)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International从网页中采集信息然后输入到另人上软件中,用C#如何编写
[问题点数:50分,无满意结帖,结帖人microtry]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:10
结帖率 98.9%
匿名用户不能发表回复!|
CSDN今日推荐Java程序设计作业_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java程序设计作业
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩5页未读,
定制HR最喜欢的简历
你可能喜欢利用python+jieba+gensim+sklearn实现微博性别分类
一、任务需求给定一组微博用户的微博帐号、性别和微博内容文本。以微博内容文本为特征,性别为标签,用数据的70%训练SVM分类器;再对剩下的30%微博文本进行性别预测,观察结果。二、所用工具python(Anaconda):编程环境
jieba:中文分词工具
gensim:训练词向量工具
sklearn:训练分类器工具三、实现过程1.数据准备
Data_weibo_male_female\GenderUserID中包含male.txt和female.txt,分别列出了各自属性的微博帐号。
Data_weibo_male_female\Weibos中包含了399个样本,以微博帐号命名,内容是对应的微博文本。
2.区分训练集和测试集
将总体数据划为五份,每一折使用其中的一份作为测试集,剩余的为训练集。
3.训练及预测过程
遍历GenderUserID文件夹,读取male.txt和female.txt,构建微博帐号(number)到性别(sex)的字典,用于查表。遍历train(test)文件夹,获取每个txt中的微博文本内容,提取其中的汉字,并按照一个txt一行的规则组合成一篇文档字符串。使用jieba对文档字符串进行分词,模式选择为精确模式,分词后将其写入train(test).txt内。使用gensim中的word2vec工具对train(test).txt训练词向量。对train(test).txt中每一行的词向量求均值称为文档向量,并与微博帐号构建微博帐号(number)到文档向量(vec)的字典,用于函数调用。对训练集中的279个微博帐号(number),根据字典获取其文档向量(vec)和性别(sex)。将训练集数据输入到sklearn中,训练svm向量机,采用高斯核。对测试集中的120个微博帐号(number),根据训练集字典获取其文档向量(vec)和性别(sex)。将测试集的文档向量(vec)输入到训练好的svm分类器中,获取分类结果并与实际值比较(五折)。
4.训练结果
accuracy: 0.73
avg / total
5.注意问题
对文本内容训练时,一定要训练词向量,而不是字向量...训练集和测试集无论在何时都要分开。测试集中的词向量,要用训练集的词典来获取,新出现的词随机初始化。SVM的输入(本例中为文档向量)要进行归一化。
四、参考文档
归一化:https://www.zhihu.com/question//answer/,http://ask.csdn.net/questions/262144list和array:http://blog.csdn.net/liyaohhh/article/details/评估方法:http://blog.csdn.net/cherdw/article/details/评估参数:http://blog.csdn.net/qq1987924/article/details/sklearn:http://scikit-learn.org/stable/gensim:https://radimrehurek.com/gensim/models/word2vec.htmljieba:https://pypi.python.org/pypi/jieba/
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 qt编写界面文本框 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信