QPython是一个可以在安卓设备运行python的脚本引擎。版本有QPython 3L和QPython 3C,3L为官方版本,可以在应用市场搜索下载。3C版本为"乘着船"大佬的修改版本。由于3L版本有许多权限限制及很多包不能安装,文章中使用3C版本完成。
百度搜索"QPython 3C开源版",进入gitee,找到链接即可下载,如下图:

百度网盘下载:https://pan.baidu.com/s/1zT1NGtYTe55m6bSRWlePRg
提取码:zxcv
帮助文档:https://www.bilibili.com/read/cv13322251
获取短信内容
获取短信将使用SL4A 的api,关于SL4A的介绍及文档,打开第一点gitee中相关链接,如下图:

话不多说,直接上代码:
获取所有短信并存入csv
import androidhelper
import csv
droid=androidhelper.Android()
# 获取短信具体内容并存入csv
def saveSMSToFile(save_path):
# 获取所有收取的短信。False为获取所有短信,True为获取未读短信;inbox为收件箱,outbox为发件箱
sms_data=droid.smsGetMessages(False, 'inbox').result
'''
id:每条短信的原始id
address:对方手机号
date:短信息的时间戳
body:短信具体内容
read:已读未读,1为已读,0是未读。
status不知道是啥
type,发信息还是收信息,1为收,2为发
'''
headers=['_id', 'address', 'date', 'body', 'read', 'status', 'type']
with open(save_path,'w') as f:
f_scv = csv.DictWriter(f, headers)
f_scv.writeheader()
f_scv.writerows(sms_data)
return save_path
jieba分词及pyecharts生成词云
# 停用词,生成词云会过滤,根据实际情况修改
FILTER_WORDS = ['你', '我','他','我们', '他们', ',','验证码',':', '的','账号', 'cn', 'https', '0.00', '点击', '退订', '尊敬','客户', 'TD', '登录','http', '12582', '61.56', '0.42','u.10010', 'http', 'com']
#获取关键词数量,用于词云展示时的数量,num可以修改,词云展示生成时的数量
def getKeyWordsCounts(filepath, num=30):
with open(filepath,'r') as f:
f_csv=csv.reader(f)
headers=next(f_csv)
content=",".join([row[3] for row in f_csv])
#print(content)
seg_list=list(jieba.cut(content))
# print(seg_list)
keywords_counts = pd.Series(seg_list)
keywords_counts = keywords_counts[keywords_counts.str.len()>1]
keywords_counts = keywords_counts[~keywords_counts.str.contains('|'.join(FILTER_WORDS))]
keywords_counts = keywords_counts.value_counts()[:num]
return keywords_counts
# 构建生成词云的元组
def getWords(keywords_counts):
words=[]
for i, v in keywords_counts.items():
words.append((i,v))
return words
# 渲染html
def render_html(html_filepath,words):
c = (
WordCloud()
.add(
"",
words,
word_size_range=[20, 100],
textstyle_opts=opts.TextStyleOpts(font_family="cursive"),
)
.set_global_opts(title_opts=opts.TitleOpts(title=os.path.splitext(html_filepath)[0]))
.render(html_filepath)
)
# 生成词云
def genWordCloud(csv_filepath,html_filepath, num=30): csv_filepath=saveSMSToFile(csv_filepath)
keywords_counts=getKeyWordsCounts(csv_filepath, num=30)
words=getWords(keywords_counts)
render_html(html_filepath, words)
csv_filepath='/storage/emulated/0/0/sms.csv'
html_filepath='/storage/emulated/0/0/短信词云分析.html'
genWordCloud(csv_filepath, html_filepath)
# 使用qpython自带的浏览器访问
jsla('viewHtml', html_filepath)
最终实现效果如下图:

完整版代码,点击底部阅读原文,回复【Qpython词云】
文章采用Sl4A和QPython完成了短信词云生成。SL4A提供了丰富的api,如通过QPython结合scikit-learn监测并过滤删除垃圾短信等,这些都由大家自己去探索。
本文由公众号【产品经理不是经理】同步发布,欢迎关注
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案