相机导购专家系统
====================================
如今单反相机的高度发达为摄影爱好者带来了无限的可能,让每个人都可以在花不是那么多钱的情况下创造艺术或是记录生活。我认为,这是科技给人带来的福音。
然而,正是因为单反市场太过发达,初入单反坑的玩家往往被搞得晕头转向。常见的单反厂商有尼康、索尼、佳能。高端市场有哈苏、徕卡,低端市场有理光、富士等。每个品牌又有很多个产品线,各有不同,设计给不同需求的用户使用。
如果对单反相机的参数没有深入的研究,仅仅是听商家的吹捧,那很难在最高的性价比上买到合适自己的那款相机。往往会花冤枉钱,或发现相机的主打功能自己根本就用不上。
本专家系统就为了解决这个问题而创建,担任一个细心公正的相机导购师,通过询问用户更在意哪方面的内容、平时使用情景、预算、对重量的承受能力等,为用户推荐最合适的相机,让用户少花冤枉钱,用最少的钱买到最有用的相机。
# 数据库的采集
对专家系统而言,不仅要有规则数据库,相机本身各项指标的数据库也非常重要。本专家系统采集权威平台:DxOMark的数据库,来获得详细的相机各项指标数据。
由于没有现成的数据可供下载,我自己使用NodeJS写了采集程序来做这件事情。代码如下:
```javascript
let request = require('request').defaults({ 'proxy': "http://127.0.0.1:1080" });
let Queue = require('promise-queue');
let fs = require('fs');
let path = require('path');
let queue = new Queue(10); //最多同时10线程采集
request('https://www.dxomark.com/daksensor/ajax/jsontested', //获得相机列表
(error, response, body) => {
let cameraList = JSON.parse(body).data;
let finishedCount = 0;
cameraList.forEach(cameraMeta => {
let camera = Object.assign({}, cameraMeta);
let link = `https://www.dxomark.com${camera.link}---Specifications`; //拼合对应的规格网址
queue.add(() => new Promise(res => { //把request放入队列,以保证同时http请求不超过10个
let doRequest = () => {
request(link, (error, response, body) => {
if (error) { //如果失败则重试
console.log("retrying.." + camera.name);
doRequest();
return;
}
let specMatcherRegexp = /descriptifgauche.+?>([\s\S]+?)<\/td>[\s\S]+?descriptif_data.+?>([\s\S]+?)<\/td>/img;
let match = specMatcherRegexp.exec(body);
while (match) { //用正则表达式匹配table里的每一个项目,并添加至采集结果中
camera[match[1]] = match[2];
match = specMatcherRegexp.exec(body);
}
fs.writeFileSync(path.join('./scraped', camera.name + '.txt'), JSON.stringify(camera, null, 4), { encoding: "UTF8" });
finishedCount++;
console.log(`Finished ${finishedCount}/${cameraList.length}: ${camera.name}`);
res();
})
};
doRequest();
}));
});
});
```
采集结果如图所示,总共采集到357款单反产品:
![scrape](imgs/scrape.gif)
# 数据清洗
数据采集完了,但有些数据比较脏(如含有 ),有些数据是我们不需要的,有些数据用起来不方便(如分辨率是 1234 x 1234形式的字符串),属性名中有空格和大写字符,也不美观。因此,额外添加一步数据清洗。
数据清洗之后,希望留下以下属性:
> 相机名称、相机图片、价格、像素数量、每秒连拍数量、重量、对焦系统质量、最大感光度、模型出厂日期、触屏存在、可录视频、有闪光灯、有蓝牙、有GPS、防水、机身材质质量
数据清洗的代码实现为:
```javascript
let fs = require("fs");
let path = require("path");
function parseNumberFunctionFactory(keyMatcher, valueMatcher = /(\d+\.?\d*)/im,
returnValueDecider = match => +match[1]) {
return (data) => {
let key = Object.keys(data).filter(_ => keyMatcher.test(_.trim()))[0];
if (!key) return null;
let match = data[key].toString().match(valueMatcher);
if (match)
return returnValueDecider(match);
else
return null;
};
}
let parseResolution = parseNumberFunctionFactory(/^resolution$/im, /(\d+)\s*x\s*(\d+)/im, match => [+match[1], +match[2]]);
let parseFrameRate = parseNumberFunctionFactory(/frame rate/im);
let parseWeight = parseNumberFunctionFactory(/weight/im);
let parseAutoFocus = parseNumberFunctionFactory(/number of autofocus points/im);
let parseISO = parseNumberFunctionFactory(/ISO latitude/im, /(\d+)\s*-\s*(\d+)/im, match => [+match[1], +match[2]]);
let parseLaunchDate = parseNumberFunctionFactory(/launchDateGraph/im, /(\d+)-(\d+)-(\d+)/im, match => new Date(match[1], match[2] - 1, match[3]));
let parseTouchScreen = parseNumberFunctionFactory(/Touch screen/im, /yes/im, match => !!match);
let parseVideo = parseNumberFunctionFactory(/^Video$/m, /yes/im, match => !!match);
let parseFlash = parseNumberFunctionFactory(/^flash$/im, /yes/im, match => !!match);
let parseWaterproof = parseNumberFunctionFactory(/^waterproof$/im, /yes/im, match => !!match);
let parseBluetooth = parseNumberFunctionFactory(/^Bluetooth$/im, /yes/im, match => !!match);
let parseGps = parseNumberFunctionFactory(/^GPS$/im, /yes/im, match => !!match);
let parseIsMetal = parseNumberFunctionFactory(/^camera material$/im, /metal/im, match => !!match);
let files = fs.readdirSync("./scraped");
files.forEach(file => {
let data = JSON.parse(fs.readFileSync(path.join('./scraped', file), { encoding: "utf8" }));
let resolution = parseResolution(data);
//机身材质质量
let frameRate = parseFrameRate(data);
let weight = parseWeight(data);
let autoFocus = parseAutoFocus(data);
let iso = parseISO(data);
let launchDate = parseLaunchDate(data);
let touchScreen = parseTouchScreen(data);
let video = parseVideo(data);
let flash = parseFlash(data);
let waterproof = parseWaterproof(data);
let bluetooth = parseBluetooth(data);
let gps = parseGps(data);
let isMetal = parseIsMetal(data);
let cleanedData = {
name: data.name,
image: data.image,
brand: data.brand,
price: data.price,
pixelDepth: data.pixelDepth,
pixels: resolution ? (resolution[0] * resolution[1]) : 0,
ISO: iso,
maxISO: iso ? iso[1] : 0,
launchDate: +launchDate,
touchScreen,
video,
flash,
waterproof,
bluetooth,
gps,
isMetal,
frameRate,
resolution,
weight,
autoFocus,
};
fs.writeFileSync(path.join('./cleaned', file), JSON.stringify(cleanedData, null, 4), { encoding: "utf8" });
});
```
清洗结果演示:
```json
{
"name": "Nikon D5",
"image": "//cdn.dxomark.com/dakdata/xml/D5/vignette3.png",
"brand": "Nikon",
"price": 6500,
"pixelDepth": 20.8,
"pixels": 20817152,
"ISO": [
50,
3280000
],
"maxISO": 3280000,
"launchDate": 1452009600000,
"touchScreen": true,
"video": true,
"flash": null,
"waterproof": null,
"bluetooth": null,
"gps": true,
"isMetal": true,
"frameRate": 14,
"resolution": [
5584,
3728
],
"weight": 1225,
"autoFocus": 153
}
```
看起来好多了。
# 问题的设计
斟酌一番后,我决定将询问用户的问题定为:
1. 您将如何使用本相机(多选)
* 记录旅行
* 拍摄学校或公司活动
* 拍摄体育比赛
* 拍摄自然风景
* 拍摄人像
* 拍摄天文
2. 您看中哪些额外功能吗(多选)
* 内置闪光灯
* 可录制视频
* 可蓝�
没有合适的资源?快使用搜索试试~ 我知道了~
人工智能课程Project —— 使用模糊专家系统做单反相机购买推荐.zip
共1457个文件
txt:1428个
js:9个
gitignore:4个
0 下载量 82 浏览量
2024-08-28
12:59:51
上传
评论
收藏 8.07MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无VIP,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的酬劳 3. 积分资源不提供使用问题指导/解答
资源推荐
资源详情
资源评论
收起资源包目录
人工智能课程Project —— 使用模糊专家系统做单反相机购买推荐.zip (1457个子文件)
camera.fcl 7KB
scrape.gif 361KB
fuzzify.gif 94KB
.gitignore 19B
.gitignore 18B
.gitignore 18B
.gitignore 18B
jFuzzyLogic.jar 4.52MB
fastjson-1.2.44.jar 526KB
Main.java 4KB
data.js 334KB
clean.js 3KB
rank.js 2KB
scrape.js 2KB
questions.js 2KB
translateTag.js 1KB
webpack.config.js 1KB
merger.js 344B
index.js 232B
merged.json 396KB
package.json 764B
package.json 301B
App.jsx 6KB
index.less 1KB
README.md 22KB
README.md 18B
README.pdf 1.41MB
ui2.png 451KB
ui.png 168KB
Sony SLT Alpha 99.txt 5KB
Sony A7S.txt 5KB
Panasonic LUMIX DMC-FZ200.txt 5KB
Sony A6300.txt 5KB
Canon EOS 6D.txt 5KB
Canon EOS 1Dx.txt 5KB
Pentax K5.txt 5KB
Panasonic Lumix DMC GH2.txt 5KB
Nikon D4.txt 5KB
Sony A6500.txt 5KB
Sony SLT Alpha 68.txt 5KB
Nikon D600.txt 5KB
Panasonic Lumix DMC-FZ70.txt 5KB
Sony SLT Alpha 99 II.txt 5KB
Sony Cyber-shot DSC-RX10 II.txt 5KB
Panasonic Lumix DMC GF6.txt 5KB
Nikon D4s.txt 5KB
Fujifilm XF1.txt 5KB
Sony Cybershot DSC-RX10 III.txt 5KB
Sony Cyber-shot DSC-RX100 IV.txt 5KB
Panasonic Lumix DMC G3.txt 5KB
Panasonic LUMIX DMC-G6.txt 4KB
Canon EOS 750D.txt 4KB
Sony Cyber-shot DSC-RX100 V.txt 4KB
Nikon D3400.txt 4KB
Sony SLT Alpha 77 II.txt 4KB
Canon EOS 760D.txt 4KB
Pentax K-50.txt 4KB
Nikon D7100.txt 4KB
Sony a9.txt 4KB
Sony SLT Alpha 77.txt 4KB
Sony A7R II.txt 4KB
Canon EOS 7D Mark II.txt 4KB
Pentax K-3 II.txt 4KB
Nikon Df.txt 4KB
Nikon D500.txt 4KB
Nikon D810.txt 4KB
Nikon D5.txt 4KB
Olympus PEN EP3.txt 4KB
Olympus PEN EPL3.txt 4KB
Canon EOS 5DS R.txt 4KB
Nikon D5500.txt 4KB
Sony A7R III.txt 4KB
Panasonic Lumix DMC-FZ1000.txt 4KB
Panasonic LUMIX DMC-LF1.txt 4KB
Nikon Coolpix P7800.txt 4KB
Sony Cyber-shot DSC-RX1R II.txt 4KB
Pentax Q.txt 4KB
Pentax K-500.txt 4KB
Sony Cyber-shot DSC-RX100.txt 4KB
Olympus XZ-2 iHS.txt 4KB
Panasonic Lumix DMC GX1.txt 4KB
Nikon D7200.txt 4KB
Panasonic Lumix DMC-GM5.txt 4KB
Canon EOS 550D.txt 4KB
Panasonic Lumix DMC GF5.txt 4KB
Panasonic Lumix DMC-GH4.txt 4KB
Canon PowerShot S100.txt 4KB
Canon EOS 5DS.txt 4KB
Sony Cyber-shot DSC-RX1.txt 4KB
Panasonic Lumix DC-GH5.txt 4KB
Olympus OM-D E-M5 Mark II.txt 4KB
Canon EOS 650D.txt 4KB
Panasonic LUMIX DMC-FZ150.txt 4KB
Nikon D5300.txt 4KB
Canon EOS-1D X Mark II.txt 4KB
Nikon D750.txt 4KB
Panasonic Lumix DMC-ZS60.txt 4KB
Canon EOS 5D Mark III.txt 4KB
Panasonic Lumix DMC-ZS100.txt 4KB
Panasonic Lumix DMC G5.txt 4KB
共 1457 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
资源评论
热爱技术。
- 粉丝: 2414
- 资源: 7862
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一种简单的排序算法 冒泡排序.zip
- 一個開會用的webex
- 嵌入式系统TLF35584芯片寄存器详解及其SPI接口应用
- 扣子+ ProcessOn将文字步骤转为流程图
- 磺酸功能化β-环糊精在有机合成反应中的应用研究进展_李文欢.caj
- 基于sEMG和IMU的手语手势识别,包括数据收集、数据预处理(去噪、特征提取,分割)、神经网络搭建、实时识别等
- 爱奇艺2023悦享会:优质内容和AIGC推动增长,片单丰富多彩
- 电感器TSMI252012PMX的技术参数与应用解析
- LED照明市场:3.75%年复合增长率下的机遇与挑战,专业咨询助您破局
- 本科毕业设计-基于Kubernetes的Linux实验考试平台的设计与实现 (WIP)+项目源码+文档说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功