首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花机学习和弹搜索分析Python中的标记/文本

火花机学习和弹搜索分析Python中的标记/文本
EN

Stack Overflow用户
提问于 2015-08-24 23:04:40
回答 1查看 1.8K关注 0票数 1

我正在构建一个应用程序,该应用程序可以在Elasticsearch中索引一堆文档,并通过布尔查询将文档检索到Spark中进行机器学习。我正试图通过Python通过pySpark和elasticsearch完成这一切。

对于机器学习部分,我需要使用每个文本文档中的标记创建特性。要做到这一点,我需要处理/分析每个文档中典型的东西,如小写,词干,删除停止词等。

因此,基本上,我需要把"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

基本上是这样的:

代码语言:javascript
复制
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的每个记录上,以分析每个记录。

见related:Elasticsearch analyze() not compatible with Spark in Python?

据我所知,这两种方法对于大型数据集来说都是极其低效的,因为它们涉及对RDD中的每个记录进行REST调用。

因此,我的问题是

  1. 有没有其他有效的方法,我可以从ES中提取分析过的文本/标记,而不对每个记录进行REST调用?也许是一个ES设置,它将分析文本与原始文本一起存储在字段中?或者在查询本身中请求分析的标记/文本,这样我就可以将其包含在elasticsearch-hadoop配置中。
  2. 对于我的问题,有没有一种替代的或更好的解决方案,可以利用星火的并行机器学习功能和类似ES的查询/存储/分析功能?
EN

回答 1

Stack Overflow用户

发布于 2015-08-26 01:34:05

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

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

例如,

代码语言:javascript
复制
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“字段的(分析)标记。目前还不清楚这会如何影响我工作中的内存消耗。它也不包括文档中每个令牌的频率一词,这可能是必要的信息。如果有人知道如何将术语频率加到令牌中,我很想听听。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32193083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档