Spark机器学习和Elasticsearch在Python中分析了令牌/文本

时间:2015-08-24 23:04:41

标签: elasticsearch apache-spark elasticsearch-hadoop elasticsearch-py

我正在尝试构建一个应用程序来索引Elasticsearch中的一堆文档,并通过布尔查询将文档检索到Spark中以进行机器学习。我试图通过pySpark和elasticsearch-py。

来完成所有这些

对于机器学习部分,我需要使用每个文本文档中的标记创建功能。为此,我需要处理/分析每个文档的典型内容,如小写,词干,删除停用词等。

所以基本上我需要将"Quickly the brown fox is getting away."变成"quick brown fox get away"["quick", "brown", "fox", "get", "away"]之类的内容。我知道你可以通过各种Python包和函数很容易地做到这一点,但我想使用Elasticsearch分析器来做到这一点。此外,我需要以对大数据集有效的方式来实现。

基本上,我想直接从Elasticsearch提取文本的分析版本或分析的标记,并以有效的方式在Spark框架内完成。作为相对ES的新手,我通过调整elasticsearch-hadoop插件找出了如何直接从Spark查询文档:

http://blog.qbox.io/elasticsearch-in-apache-spark-python

基本上是这样的:

read_conf = {
    'es.nodes': 'localhost',
    'es.port': '9200',
    'es.resource': index_name + '/' + index_type,
    'es.query': '{ "query" : { "match_all" : {} }}',
    } 

es_rdd = sc.newAPIHadoopRDD(
    inputFormatClass = 'org.elasticsearch.hadoop.mr.EsInputFormat',
    keyClass = 'org.apache.hadoop.io.NullWritable', 
    valueClass = 'org.elasticsearch.hadoop.mr.LinkedMapWritable', 
    conf = read_conf)

此代码将或多或少地从ES检索未分析的原始存储版本的文本。我还没想到的是如何以有效的方式查询分析的文本/令牌。到目前为止,我已经找到了两种可能的方法:

  1. 将elasticsearch-py提供的es.termvector()函数映射到RDD的每条记录,以检索分析的标记。
  2. 将elasticsearch-py提供的es.indices.analyze()函数映射到RDD的每条记录上,以分析每条记录。
  3. 参见相关内容:Elasticsearch analyze() not compatible with Spark in Python?

    根据我的理解,这两种方法对于大数据集来说都是非常低效的,因为它们涉及对RD中每条记录的ES调用。

    因此,我的问题是

    1. 是否有另一种有效的方法可以从ES中提取已分析的文本/令牌,而无需为每条记录进行REST调用?也许ES设置将分析的文本与原始文本一起存储在字段中?或者能够在查询中请求分析的令牌/文本,以便我可以将其包含在elasticsearch-hadoop配置中。
    2. 我的问题是否有替代或更好的解决方案可以利用Spark的并行机器学习功能和类似ES的查询/存储/分析功能?

1 个答案:

答案 0 :(得分:1)

我可能通过使用" fielddata_fields"找到了一个临时解决方案。搜索查询正文中的参数。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fielddata-fields.html

例如,

read_conf = {
    'es.nodes': 'localhost',
    'es.port': '9200',
    'es.resource': index_name + '/' + index_type,
    'es.query': '{ "query" : { "match_all" : {} }, "fields": ["_id"], "fielddata_fields": "text" }',
} 

返回带有id和(分析)标记的文档,用于" text"领域。目前还不清楚这会如何影响我工作中的记忆消耗。它还不包括文档中每个标记的术语频率,这可能是必要的信息。如果有人知道如何在标记中添加术语频率,我很乐意听到它。