用Python标记用于搜索的文本

Cla*_*ell 4 python string search tokenize elasticsearch

寻找有关如何为搜索标记文本的策略,以及如何实现它们的一些想法.

具体来说,我们正在尝试将用户生成的业务审核标记为有助于我们的业务搜索引擎.所有代码都是Python.

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

  • 将复数名词转换为单数
    我发现了一个名为inflect的图书馆似乎做得很好,有没有人有任何经验呢?

  • 摆脱所有非字母数字字符
    这似乎是我的正则表达式的工作,但我很想听到任何其他建议

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

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

背景信息 :(从评论到Dough T关于Solr或Elastic搜索的建议)
我们正在使用ElasticSearch,我们使用它的工具进行基本标记化.我们想要单独进行上面描述的标记化,因为在标记化之后,我们将需要应用一些非常复杂的语义分析来从文本中提取意义.我们希望灵活地准确地标记我们如何指定,以及使用我们自己的数据注释附加到我们自己的格式存储令牌的便利性.
我们绝对需要的一件事是每个令牌的单个(大)数据库记录,可以随时访问和修改,其中包含与该令牌的使用相关的所有内容.我认为,当文档被索引时,排除仅使用ES标记化来处理它们.我们可以使用ES的分析模块来分析文本而不对其进行索引,然后单独处理每个令牌以构建/更新令牌的数据库记录......我们寻求有关此方法的建议.

Dou*_* T. 5

我想你想要研究一个全文搜索解决方案,它提供你描述的功能,而不是在python中实现你自己的功能.这个领域的两大开源参与者是弹性搜索和solr.

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

这是solr架构的一个例子,它有一些有用的东西:

定义字段类型

<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>
Run Code Online (Sandbox Code Playgroud)

定义一个字段

<field indexed="true" name="text_body" stored="false" type="text_en"/>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过python通过一个漂亮的REST API使用搜索服务器,或者直接使用Solr/Elasticsearch.