Java语言怎么让现在大火的人工智能算法实现对一个网站上问题的自动回答的功能的开发,这是网络爬虫还是网络机器人的算法?两种技术的路线的区别大么
要实现对一个网站上问题的自动回答的功能涉及到两个方面的技术比如说, 网络爬虫和自然语言处理(NLP),这两种技术是相互关联的,但有着不同的功能和应用领域。
至于你说的两种技术路线的区别,可以这么说, 网络爬虫主要关注从网页中提取信息的过程,包括抓取、解析和存储等操作;而自然语言处理主要关注对文本数据进行理解、分析和生成的过程,包括词法分析、句法分析、语义理解、机器翻译等等。两者在技术实现上有一些重叠,但侧重点不同
我们定义一个人的类型,其中包括年龄和是否成年两个属性。在修改年龄属性的时候会同时修改是否成年的属性。我们假设18岁和18岁以上就是成年,否则就是未成年。
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
class Person {
/**
* 18岁成年
*/
private static final int ADULT_AGE = 18;
/**
* 年龄
*/
private int age;
/**
* 是否成年
*/
private boolean adult;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
this.adult = age >= ADULT_AGE;
}
public boolean isAdult() {
return adult;
}
public String toString() {
return MessageFormat.format("age:{0},adult:{1}", age, adult);
}
}
/**
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public class Test {
/**
* 利用反射修改对象属性
* @param o
* @param fieldName
* @param value
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void changeObjectFieldByReflection(Object o, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
Field field = o.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(o, value);
}
/**
* 利用内省修改对象属性
* @param o
* @param fieldName
* @param value
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void changeObjectFieldByIntrospector(Object o, String fieldName, Object value) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
PropertyDescriptor pd = new PropertyDescriptor(fieldName, o.getClass());
pd.getWriteMethod().invoke(o, value);
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IntrospectionException, InvocationTargetException {
Person p = new Person();
changeObjectFieldByReflection(p, "age", 20);
System.out.println("反射修改属性破坏类的封装,使其内部状态错误:");
System.out.println(p);
changeObjectFieldByIntrospector(p, "age", 18);
System.out.println("内省修改属性未破坏类的封装:");
System.out.println(p);
}
}
可以看到,反射由于是直接修改属性,所以破坏了类中封装的逻辑(20岁却不是成年)。
而内省由于修改属性还是调用了set方法,也就是说和正常修改对象属性调用了相同的方法,所以类的封装性不会遭到破坏。
当然由于内省其实本质也是反射,可以说是封装了反射,所以如果反射用的正确,也是安全的,我们可以根据属性名去获取相应的set和get方法,然后再去调用,但是这种情况下内省使用起来就更方便,毕竟没有必要重复发明一个车轮子,圆形轮子已经是很多年很多年智慧的结晶了。
那么问题来了,既然内省就是调用set和get方法,那我为什么不直接调用set和get方法,而要使用内省呢?