web应用程序和web网站
为了在快速发展的全球行业中保持相关性,技术专业人员必须跟踪IT的重大趋势,并找到方法将重要的趋势纳入其公司的技术产品组合中。 这样的趋势之一就是使用推荐引擎来驱动用户探索您的网站或企业的其他产品。 这些引擎根据各种模式向用户提供建议,并有助于指导用户根据其特定的用户习惯来考虑他们可能不会意识到的产品。
一些非常受欢迎的网站广泛使用了推荐引擎。 例如,访问Amazon或Netflix的访客经常会看到个性化的建议,例如“如果您喜欢该商品,您可能也会喜欢它……”。这些网站使用建议来帮助将用户(和收入)吸引到其他方面它们以智能,有意义的方式提供,专门针对用户和用户的喜好进行量身定制。
即使您的公司不提供书籍或电影,也可能有很多理由实施类似的事情。 您可以推荐企业提供的相关产品,特别是如果您拥有广泛的产品组合。 您可以为更抽象的概念提供建议,例如您希望用户访问的相关页面,热门服务列表,适用的教育机会,特殊优惠或访问有用的技术支持文档。
通过建议的个性化设置,无需尝试猜测您广泛的用户群感兴趣的内容,而是使您能够毫不扰动和明智地识别单个用户的喜好,并使用此信息来自定义每个用户的体验。 根据过去的行为推荐一种新选择的任务是在许多应用程序和行业中都有广泛的用途,因此,本文将始终引用此示例。
Apache Mahout是一个开源推荐引擎,可以很好地应用这些概念,它虽然小巧但功能强大,足以在中小型商业案例中实施。 本文概述了如何使用用于WebSphere软件V8.0.3的IBM Rational Application Developer将Apache Mahout V0.5与IBM WebSphere Application Server V8集成。 它从对推荐引擎的概述开始,从高层次描述了Apache Mahout,解释了如何将其与WebSphere Application Server和Rational Application Developer集成,然后提供了一些后续步骤,以查找有关该技术的更多信息。
推荐引擎概述
推荐引擎的主要目的是对现有数据进行推断,以显示对象之间的关系。 对象可以是很多东西,包括用户,项目,产品等。 关系提供对象之间的相似度或归属度。 例如,关系可以表示用户对项目的喜欢程度(标量),或者指示用户是否对特定页面添加了书签(二进制)。
为了提出建议,建议引擎执行几个步骤来挖掘数据。 最初,您从代表对象及其关系的输入数据开始。 输入数据由对象标识符和与其他对象的关系组成。 图1从高层次显示了这一点。
图1.大图
![图1.大图](https://i-blog.csdnimg.cn/blog_migrate/edbb1c2c141c102eb53473253971743f.png)
考虑用户对项目的评分。 推荐引擎使用此输入数据来计算对象之间的相似度。 根据数据大小或特定算法,计算对象之间的相似性可能会花费大量时间。 诸如Apache Hadoop之类的分布式算法可用于并行化相似度的计算。 有多种类型的算法可以计算相似度。 最后,使用相似性信息,推荐引擎可以基于请求的参数发出推荐请求。
可能您认为推荐引擎会有所帮助,但由于您认为推荐引擎太复杂而无法使用。 推荐引擎领域实际上很大,并且可能非常复杂。 幸运的是,有可用的工具可以轻松地在单个文章的时间和空间内显示必要的概念。 更好的是,一旦授课,这些相同的工具可用于将课程应用于现实世界。 Apache Mahout的设计师将可伸缩性和可用性作为项目的核心部分,因此您可以根据需要扩展构建解决方案。
当您决定开始个性化您的应用程序并想要使用推荐引擎时,需要做出一些重要的决定:
- 适用哪种算法
您需要做出的最重要的决定是将哪种算法应用于数据。 算法的选择取决于您要识别的内容以及在数据中指定的关系类型。 用于建议的一些常用方法包括:
- 协作过滤:这种方法依赖于用户之间的社交互动。 这些建议基于其他用户提供的评级。
- 聚类:使用这种方法,推荐引擎会尝试根据用户或项目本身之间的相似性来构建推荐。
- 分类:此方法使用通用属性将项目自动分组到类别中。 在分类中,计算机尝试对所有项目进行分类。
本文将重点讨论协作过滤,以帮助您了解用户的社交方面; 这也是向Web应用程序添加建议的良好起点。
协作过滤是一种简单且流行的技术。 这很容易,因为您的客户为您完成了重要的工作-他们决定了您要突出显示的内容的标准。 协同过滤分析来自其他用户或项目的评级以提出建议。 协作过滤中有两种方法:它们之间的主要区别在于每种方法都可以随着系统中用户数量的增长而扩展:
- 基于用户的推荐
通过查看每个用户评分项目的共性,这种推荐可以在用户之间建立相似性。 例如,如果项目是课程,则两个用户上相同的课程就可以认为他们非常相似。 在另一个极端,如果他们不采取任何类似的做法,它们的相似性将很低。 为了提出建议,算法依赖于类似用户对那些用户未修课的课程的评分。 此建议是最基本的建议; 但是,它的主要局限在于,为了产生相似性,它需要将每个用户与每个其他用户进行比较。 对于用户数量少的应用程序,这是可以接受的,但是如果用户数量增加,则执行此评估的时间将成倍增加。
- 基于项目的推荐
另一方面,基于项目的推荐始于查看与用户关联的项目。 对于与用户关联的每个项目,算法都会计算出与集合中其他项目的相似程度,以构建推荐列表。 为了确定用户喜欢推荐项目的可能性,该算法查看用户对该项目给出的评级,并对每个推荐项目给出加权评级。 基于项目的建议的主要问题是,它需要为每个可用项目建立相似性索引。 但是,项目更改的频率要比用户更改的频率低,因此,使用此类建议可以离线预先计算相似度并在特定时间更新它们是可行的。
- 如何将流程扩展到您的用户
计算用户和项目之间相似度的实际过程是一个过程密集型操作。 根据数据集的大小,操作可能需要几毫秒到几分钟的时间。 使用基于Web的应用程序时,如果用户需要等待较长时间才能收到建议,则响应时间成为问题。
虽然可以实时计算用户和项目之间的相似度,但是在使用较大的数据集时,需要仔细评估这一点。 对于基于用户和基于项目的推荐方法,最佳实践建议如果数据集较大(例如,超过100万个评分),则脱机执行这些计算。 在不经常添加新项目或用户仅偶尔对项目进行评分的情况下,使用离线计算变得可行,因为仅在添加新项目或对项目应用新评分时才需要计算相似度。 在这种情况下,推荐引擎可以使用最终会保持一致的相似性来工作。
一种用于离线预先计算相似性的方法是利用产品的分布式计算功能,例如Apache Hadoop,这是MapReduce技术的开源实现。 这就是为什么您会经常听到与推荐引擎一起提到的那些系统的原因。 如果您要基于大量分散的数据进行推荐,则需要精简数据,而这些系统使您能够做到这一点。
幸运的是,Apache Mahout提供了可以提交给Apache Hadoop的作业,以帮助您计算相似性。 一旦计算完成,就可以将结果加载到所需的数据源中,以便Web应用程序可以使用它。
- 数据存储在哪里
最后,您需要确定数据的存储位置。 该数据可以包含原始输入数据或具有脱机流程已经计算出的相似性的数据,例如Apache Hadoop。 如果数据源是大量原始数据存档,那么您可能需要对其进行挖掘以获取一些内容以供推荐引擎使用。 您可以将数据集存储在文件系统或分布式数据源中。 如果数据集较小,则可以让程序从文件系统读取数据并将其存储在工作内存中。 但是,如果数据集很大,则可能要考虑使用数据库管理系统,例如IBMDB2®,Apache Derby等。 如果选择分布式数据源,则将要确保正确配置了正确的查询优化设置(例如索引)。
但这并不需要那么复杂。 为简单起见,在这里假设您的数据池足够小以适合小型数据库,例如Apache Derby,这是WebSphere Application Server V8附带的基于Java™的开源数据库管理系统。 重要的是,在继续采用该方法时,您需要根据特定数据确定是否需要使用分布式文件系统或传统的关系数据库管理系统。
示例场景
如developerWorks文章Apache Mahout简介中所述,Apache Mahout项目的目标是构建可扩展的机器学习库。 Apache Mahout是在Apache Hadoop之上实现的,但不仅限于分布式文件系统。
这使我们成为本文的重点,即Apache Mahout提供的用于将数据处理为建议的机器学习算法。 就本文而言,我们将重点介绍Apache Mahout当前实现的基于用户的过滤机器学习任务。 在本示例中使用社交引用,因为有很多方法可以获取此数据,并且数据很容易登录到数据库中。
假设您要创建一个Web应用程序,使用户能够基于其他用户提供的评级来获得项目推荐。 可用的数据集包含用户对项目的评分。 为了简单起见,本文附带的示例数据是通用的,因为我们仅使用用户和项目的标识符。 在现实世界的应用程序中,您需要在显示给用户之前用其显示名称替换推荐项目的唯一标识符。
图2.示例拓扑
![图2.流程图](https://i-blog.csdnimg.cn/blog_migrate/0ecba30fbd2c703a84b0cfe1ed8faaf5.png)
因此,如图2所示,用户将在应用程序中请求servlet。 该应用程序将调用推荐引擎,以为用户提供一组推荐。 推荐引擎将从数据源检索数据并实时计算相似度。
配置开发环境
要执行本文概述的步骤,您将需要按照以下说明设置开发环境:
- 下载Apache Mahout
- 访问Apache Mahout网站,并下载最新版本的Apache Mahout。 在撰写本文时,最新版本为0.5(mahout-distribution-0.5.zip)。
- 将存档的内容提取到已知位置。 这些内容文件将在以后引用。
- 创建Java EE应用程序项目
- 启动WebSphere Application V8.0.3的Rational Application Developer。
- 切换到Java EE透视图。
- 选择文件>新建>企业应用程序项目 。
- 对于项目名称,输入
RecommenderApp
。 - 确保将目标运行时设置为WebSphere Application Server v8.0 ,然后单击Next 。
- 在下一个面板上,单击New module ...,然后从弹出窗口中选择Only Web module并将其名称设置为
RecommenderWeb
。 - 单击确定 ,然后单击完成 。
- 用样本数据创建并填充数据库
Apache Derby是基于Java的数据库,它使用文件存储进行存储。 在本示例中使用Apache Derby,因为它包含在Rational Application Developer中。
- 选择窗口>显示视图>数据源资源管理器 。
- 右键单击数据库连接,然后选择新建...
- 对于JDBC驱动程序,选择Derby 10.5-Embedded JDBC Driver Default 。
- 由于Derby将数据库存储在文件系统中,因此您需要指定其驻留位置。 对于数据库位置,输入用于数据库的路径和名称。 对于此示例,
PREFERENCES
用作数据库名称。 - 将用户名和密码字段留空,然后单击完成 。
接下来,您将使用脚本定义数据模型(清单1)。 该脚本首先创建一个称为PREFERENCES的模式和一个名为aste_preferences的表。 该表包含用户对每个项目的所有评分。 它包含四列:user_id,item_id,首选项和时间戳。 表中的每个元组表示用户user_id已对项目item_id进行了排名,并为其赋予了优先级。
清单1.数据源模式
CREATE SCHEMA PREFERENCES; CREATE TABLE PREFERENCES.taste_preferences ( user_id BIGINT NOT NULL, item_id BIGINT NOT NULL, preference FLOAT NOT NULL, "timestamp" BIGINT, PRIMARY KEY (user_id, item_id) );
由于需要对数据库进行大量访问,因此还必须定义两个索引以加快搜索时间(清单2),这一点非常重要。
清单2.表索引SQL
CREATE INDEX PREFERENCES.user_id_idx ON PREFERENCES.taste_preferences ( user_id ); CREATE INDEX PREFERENCES.item_id_idx ON PREFERENCES.taste_preferences ( item_id );
接下来,创建数据模型:
- 下载createtable.sql( 本文随附 )并将其保存在RecommenderWeb项目中。
- 从Java EE角度来看,右键单击RecommenderWeb项目,然后选择Refresh 。 现在应该显示出createtable.sql脚本。
- 右键单击createtable.sql脚本,然后选择“ 执行SQL文件” 。
- 确认服务器类型设置为Derby _10.x ,连接配置文件和数据库名称正确,然后单击“ 确定” 。
- 您可以通过查看SQL Results视图来验证脚本是否成功完成(图3)。
图3.创建表后SQL Results视图
现在您已经创建了表,您可以向其中加载一些数据:
- 下载文件u.data ( 本文随附 )。 这是从MovieLens数据集中以逗号分隔的大约1万个用户评分的列表。 与使用SQL脚本一样,将此文件保存到RecommderWeb项目。
- 从Java EE角度来看,右键单击RecommenderWeb项目,然后选择Refresh 。 现在应显示u.data文件。
- 在“数据源资源管理器”视图中,展开数据库连接>偏好>偏好>模式>偏好>表 。
- 右键单击表TASTE_PREFERENCES,然后选择“ 加载...”。
- 对于输入文件,单击浏览并导航到RecommenderWeb文件夹,然后选择u.data并单击确定 。
- 对于列定界符,选择制表符 。 确保选中了替换现有数据 ,然后单击完成 。
- 现在应该开始加载过程。 加载整个数据集最多可能需要60秒。 您可以从“ SQL结果”视图中验证加载是否成功完成(图4)。
图4.将数据加载到数据库后SQL Results视图
- 您可以通过右键单击TASTE_PREFERENCES表并选择Data> Sample Contents来验证加载的数据 。
- 通过选择“ 数据源资源管理器”视图并展开“ 数据库连接”,断开与数据库的连接 。
- 右键单击选择和选择断开连接 。
现在,您已经完成了数据存储和示例数据的创建。
- 配置Apache Mahout库
为了开发推荐程序代码,您需要将所需的Apache Mahout库导入您的企业应用程序。 (如果要在环境中的多个企业项目之间共享Apache Mahout库,则建议的方法是配置共享库。)
- 展开EAR Projects ,右键单击RecommenderApp ,然后选择Import> Import...。
- 选择常规>文件系统 ,然后单击下一步 。
- 在“从目录”中,浏览到您提取Apache Mahout文件的位置,然后单击“ 确定” 。
- 从导入对话框中选择下表中列出的文件:
图书馆名称 位置 mahout-core-0.5.jar mahout-distribution-0.5 / mahout-core-0.5-job.jar mahout-distribution-0.5 / slf4j-jcl-1.6.0.jar mahout-distribution-0.5 / lib - 点击完成 。
- 现在将这些引用添加到Web应用程序,以便您可以定义用于编译的类路径。 右键单击RecommenderWeb项目,然后选择“ 属性” 。
- 选择“ Java构建路径” ,然后单击“ 添加JAR”。
- 从弹出对话框中,展开RecommenderApp ,选择mahout-core-0.5.jar和mahout-core-0.5-job.jar并单击OK (图5)。
图5. RecommenderWeb项目的Java Build Path编辑器
- 在RecommenderWeb项目中,展开WebContent> META-INF并双击MANIFEST.MF 。
- 在Dependencies> Jar或Module下,在所有三个库旁边放置一个复选标记(图6)。
图6. RecommenderWeb项目的依赖项编辑器
- 保存并关闭编辑器。
至此,您已经完成了开发环境的配置,并准备开始编写推荐代码。
构建推荐引擎
接下来,您将创建该servlet,该servlet将处理来自Apache Mahout的推荐引擎代码。
- 创建一个Servlet类
首先创建代表您的Web应用程序的servlet类。
- 右键单击RecommenderWeb项目,然后选择“ 新建”>“ Servlet” 。
- 对于Java Package,输入
com.ibm.sample.recommender
。 - 对于类名,输入
TestServlet
。图7.创建Servlet –指定类文件目标面板
- 单击下一步 。
- 在下一个面板上,接受默认值,然后单击Next 。
- 在下一个面板上,取消选中doPost并单击Finish (图8)。
图8. Create Servlet –指定要生成面板的方法存根
完成此步骤后,您将拥有一个空的servlet类,您可以在其中添加推荐引擎的代码。
- 导入源代码
本文包含 servlet类的示例源代码,包含在文件snippet1.txt中。 下载此文件,并使用它替换TestServlet.java源文件的内容。
现在是检查代码的重要部分以帮助您了解正在执行的工作的好时机。
- 创建数据模型
以前,您创建了数据库并加载了数据集。 在此步骤中,您将定义一个数据模型对象,该对象通过使用JDBC调用提供对此数据集的访问。 Apache Mahout仅为MySQL和PostgreSQL数据源提供JDBC实现类。 如果要使用其他数据源,则有以下三种选择:
- 使用GenericJDBCDataModel类,并在构造函数方法中提供所有需要SQL查询。
- 扩展AbstractJDBCDataModel来为您的数据源添加一个实现。
- 尝试使用现有的实现之一来验证它是否兼容。
对于Derby而言,PostgreSQL实现是兼容的,因此可以在这里使用(清单3)。 但是,对于更健壮的实现,您可能希望选择扩展AbstractJDBCDataModel实现的第二个选项。
清单3.数据模型定义
private @Resource (name="jdbc/taste") DataSource tasteDS; dataModel = new PostgreSQLJDBCDataModel(tasteDS, "PREFERENCES.TASTE_PREFERENCES", "USER_ID", "ITEM_ID", "PREFERENCE", "TIMESTAMP");
org.apache.mahout.cf.taste.model.DataModel接口类表示由相似性和推荐类访问的数据模型。 此接口有不同的实现(文件,JDBC等)。 为了管理应用程序初始化后使用的数据,可以使用下表中显示的方法。
方法名称 描述 FastIDSet
getItemIDsFromUser(long userID)返回用户表示偏好的商品的所有商品ID Float getPreferenceValue(long userID, long itemID)
给定用户对给定项目的偏好值;如果不存在,则为null int getNumUsers()
该模型已知的用户总数。 void setPreference(long userID, long itemID, float value)
为用户设置特定的首选项(项目加等级)。 void removePreference(long userID, long itemID)
删除用户的特定首选项。 - 产生用户相似度
定义数据模型后,接下来要做的就是计算数据的相似性。 Apache Mahout提供了几种算法来计算用户之间的相似度。 其中包括:City Block相似度,Euclidean距离相似度,LogLikelihood相似度,Pearson相关相似度,SpearmanCorrelation相似度,TanimotoCoefficient相似度,UncenteredCosine相似度等。 (有关这些算法的更多信息,请参见Mahout发行版中包含的javadoc文档。)
随着项目数量和评分的增加,计算用户之间相似度的过程的时间也会增加。 因此,您应该离线处理大型数据集的相似度计算; 例如,通过为Apache Mahout创建作业。 然后,可以将这些离线任务的相似性结果包括在数据模型中。
本文中使用的示例利用了PearsonCorrelationSimilarity算法,该算法实时执行计算,而无需执行脱机计算。
因此,让我们为您的数据模型执行相似度计算:
UserSimilarity similarity = new
PearsonCorrelationSimilarity(dataModel);现在,相似性变量包含数据模型中所有可用用户的相似性信息。
- 定义用户社区
基于用户的推荐算法利用用户邻域来指定应将哪些用户视为给定用户。 本示例使用NearestNUserNeighborhood实现,该实现使您可以指定邻域中应包含多少用户的限制。 在此示例中,邻居的成员资格由五个最相似的用户组成,因此邻居定义如下:
UserNeighborhood neighborhood = new NearestNUserNeighborhood(5, similarity, dataModel);
社区中的成员被认为与用户非常相似。 因此,随着成员的增加,推荐项目的数量也会增加,因为更多的成员会推荐更多的项目。
- 提出建议
现在您已经计算了用户之间的相似度并指定了用户的邻域,您可以继续进行并提出用户建议。 Apache Mahout提供了Recommender界面来访问用户的建议:
Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
定义了荐荐者后,您可以通过调用荐荐(long,int)方法并传递用户ID和要接收的推荐项目的最大数量来提出建议。 从那里,您可以使用Iterator处理每个建议。
清单4显示了如何为用户提取推荐。
清单4.通过建议进行迭代
java.util.List<RecommendedItem> list = recommender.recommend(USER_ID, 10); Iterator<RecommendedItem>iter = list.iterator(); while ( iter.hasNext()) { RecommendedItem item = iter.next(); out.println("<tr><td>" + item.getItemID() + "</td><td>" + item.getValue() + "</td></tr>"); }
因此,总而言之,基于用户的推荐首先从数据集中计算出用户之间的相似度,然后使用邻域项来指定应将哪些用户视为与当前用户相似。 利用该信息,推荐器算法能够基于相似用户已对哪些项目进行评分来做出推荐,并使用此信息来估计当前用户可能喜欢这些项目的程度。
- 在Web应用程序中测试引擎
在WebSphere Application Server V8中测试应用程序之前,您需要在服务器上配置数据源并为该数据源定义JNDI参考,以便Servlet可以访问它。
要配置数据源:
- 在“服务器”视图中,右键单击位于localhost的WebSphere Application Server,然后选择启动 。
- 服务器启动后,右键单击服务器,然后选择管理>运行管理控制台 。
- 如果启用了身份验证,请在控制台打开时输入您的用户ID和密码。 单击登录 。
- 展开资源> JDBC> JDBC提供程序 。
- 对于作用域,请选择“ 服务器作用域”。
- 点击新建...
- 输入值,如图9所示。
图9.新建JDBC提供程序面板
- 单击下一步 。
- 验证配置,然后单击完成 。
- 返回JDBC Providers列表,单击Derby JDBC Provider 。
- 在“其他属性”下,单击“ 数据源” 。
- 点击新建...
- 对于JNDI名称,输入
jdbc/taste
(图10)。图10.数据源JDNI名称定义面板
- 单击下一步 。
- 对于数据库名称,输入您创建的用于加载数据模型的Derby数据源的文件路径位置。 取消选中在包含的托管持久性(CMP)中使用此数据源 (图11)。
图11.数据库名称规范面板
- 单击下一步 。
- 对于步骤3,将安全配置保留为空白,然后单击下一步 。
- 对于步骤4,验证定义的设置,然后单击完成 。
- 单击保存保存配置。
这些都是您需要在WebSphere Application Server V8上进行的所有更改。 数据源绑定信息已经在Servlet代码中使用Servlet 2.5批注定义(请参阅snippet1.txt),因此不必在Web模块部署描述符中对其进行配置。 最后一步是将应用程序安装到服务器:
- 在“服务器”视图中,右键单击WebSphere Application Server V8测试服务器,然后选择“ 添加或除去...”。
- 选择RecommenderApp并单击添加 。
- 点击完成 。
而已。 现在已经安装了该应用程序,您终于可以进行测试了。
要测试该应用程序:
- 从“服务器”视图启动WebSphere Application Server V8测试服务器(如果尚未启动)。
- 展开Dynamic Web Projects> RecommenderWeb> RecommenderWeb> Servlet (图12)。
图12. Dynamic Web Projects视图
- 右键单击TestServlet,然后选择“运行方式”>“在服务器上运行” 。
- 在本地主机上选择WebSphere Application Server V8,然后单击Finish 。
- 内部浏览器不应启动,并且可以显示推荐结果(图13)。
图13.建议结果
- 创建数据模型
从示例中可以看到,您要为其检索推荐的用户是用户400。该用户已对22项进行了评分。 基于数据模型和推荐算法,Apache Mahout能够推荐一组项目以及该用户可能给他们的预测等级。
从这往哪儿走
既然您对推荐引擎有所了解,那么下一步呢?
对于初学者,您可以开始看到已经包含推荐引擎的产品所提供的额外价值。 例如,IBM WebSphere Portal和IBM WebSphere Commerce Suite包括推荐引擎作为其基本产品的一部分。 通过此类软件产品,IBM在管理有关在线隐私,性能和集成的问题的同时,改善了这些领域的支持。 (如果您需要考虑任何“构建或购买”决策,请牢记这些产品的内置功能。)
本文没有讨论一个可能的大流程,即使用map reduce作业处理大量数据。 此处未解决,但IBM已解决。 IBM的大数据计划可以帮助管理某些应用程序所需的大量数据。 如前所述,由于极大地增加了用户数量的资源限制,此处介绍的示例解决方案无法扩展到某个点。 大的处理问题变得越来越普遍,不需要停止进度。 使用大数据计划,没有理由受到任何规模的处理的阻碍。
您不需要大型数据中心即可使用Apache Mahout。 当然,有了云计算,您不需要任何解决方案的数据中心。 云计算与推荐引擎空间没有直接关系,但是值得一提的是,IBM的云计划可以使您有能力以其他方式无法尝试的方式来尝试其中的某些事情。
结论
您可以看到,推荐引擎可以根据用户的个人特征或行为,通过将用户吸引到其他产品或Web产品,从而为您的Web应用程序添加强大的新维度。 本文简要介绍了推荐引擎使用的技术,以及如何使它们更具可伸缩性。 您还了解了Apache Mahout如何利用这些技术并将其集成到Web应用程序中。 通过将这些概念集成到IBM WebSphere Application Server中,您了解了可以扩展现有Web应用程序并对其进行有效的个性化设置。
翻译自: https://www.ibm.com/developerworks/websphere/techjournal/1109_zegarra/1109_zegarra.html
web应用程序和web网站