elasticsearch,tokenize,Python,String,Search,elasticsearch,Tokenize" /> elasticsearch,tokenize,Python,String,Search,elasticsearch,Tokenize" />

在Python中对搜索文本进行标记化

在Python中对搜索文本进行标记化,python,string,search,elasticsearch,tokenize,Python,String,Search,elasticsearch,Tokenize,寻找如何标记搜索文本的策略,以及如何实现这些策略的一些想法。 具体来说,我们正在尝试标记用户生成的业务评论,以帮助我们的业务搜索引擎。所有代码都是Python 我认为我们至少需要做以下几点: 将复数名词转换为单数 我发现一个叫做的图书馆似乎做得很好,有人有这方面的经验吗 删除所有非字母数字字符 对我来说,这似乎是regex的工作,但我很想听听其他的建议 基于空格标记化,将连续空格转换为单个空格 我认为这在Python中通过一些自定义字符串操作是可行的,但是可能有更好的方法 是否有人对我需要做

寻找如何标记搜索文本的策略,以及如何实现这些策略的一些想法。

具体来说,我们正在尝试标记用户生成的业务评论,以帮助我们的业务搜索引擎。所有代码都是Python

我认为我们至少需要做以下几点:

  • 将复数名词转换为单数
    我发现一个叫做的图书馆似乎做得很好,有人有这方面的经验吗

  • 删除所有非字母数字字符
    对我来说,这似乎是regex的工作,但我很想听听其他的建议

  • 基于空格标记化,将连续空格转换为单个空格
    我认为这在Python中通过一些自定义字符串操作是可行的,但是可能有更好的方法

是否有人对我需要做的事情有其他想法来标记文本?另外,您对上述实施策略的技术和工具有何看法

背景信息:(来自
T
关于Solr或弹性搜索的建议的评论)
我们正在使用ElasticSearch,我们使用它的工具进行基本的标记化。我们想单独进行上面描述的标记化,因为在标记化之后,我们需要应用一些非常复杂的语义分析来从文本中提取意义。我们希望能够灵活地将指定的方式标记化,并希望能够方便地将标记以我们自己的格式存储,并将我们自己的数据注释附加到标记上

我们绝对需要的一件事是每个令牌都有一个(大型)数据库记录,可以随时访问和修改,其中包含与该令牌使用相关的所有信息。我认为这排除了在文档被索引时仅使用ES标记化来处理它们的可能性。我们可以使用ES的分析模块来分析文本,而无需对其进行索引,然后单独处理每个令牌,以便构建/更新令牌的数据库记录。。。我们寻求有关这种方法的建议。

我认为您希望研究一种全文搜索解决方案,它提供您描述的功能,而不是在python中实现您自己的功能。这一领域的两大开源玩家是和

使用这些产品,您可以配置定义自定义标记化、删除标点符号、同义词以帮助搜索、不仅仅是空白标记化等的字段。您还可以轻松添加插件来更改此分析链

以下是solr模式的一个示例,其中包含一些有用的内容:

定义字段类型

-->
定义字段


然后,您可以通过python通过一个漂亮的REST API使用search server,或者直接使用Solr/Elasticsearch。

事实上,我们正在使用Elasticsearch,我们确实使用它的工具进行基本的标记化。我们想单独这样做,因为在标记化之后,我们需要应用一些非常复杂的语义分析来从文本中获取意义。我们希望能够灵活地将指定的方式标记化,并希望能够方便地将标记以我们自己的格式存储,并将我们自己的数据注释附加到标记上。尽管这种逻辑可能被误导,我想。@ClayWardell我主要是一个Solr人,它为您提供了一个完整的分析链,用于在Java中定义您自己的标记化。例如,许多语言的标记化非常复杂,因此它们在solr中有自己的标记化器。至于另一个问题。。。我的同事说,您可以将称为有效负载的内容附加到具有任意元数据的令牌上。但不知道ES。我们绝对需要的是每个令牌的单个(大型)数据库记录,可以随时访问和修改,其中包含与该令牌使用相关的所有信息。我认为这排除了在文档被索引时仅使用ES标记化来处理它们的可能性。我们可以使用ES的分析模块来分析文本,而无需对其进行索引,然后单独处理每个令牌,以便构建/更新令牌的数据库记录。。。这对您来说是个好主意吗?您可以设置一个弹性搜索实例来将文本处理成令牌吗?你能从Elasticsearch中获得代币吗?@ClayWardell Elasticsearch目前不支持每个代币的有效载荷,因为它基于旧版本的lucene。
<fieldType class="solr.TextField" name="text_en" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>-->
    <filter catenateAll="0" catenateNumbers="1" catenateWords="1" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ASCIIFoldingFilterFactory"/>
  </analyzer>
 </fieldType>
<field indexed="true" name="text_body" stored="false" type="text_en"/>