python - 标记文本以在 Python 中进行搜索

标签 python string search elasticsearch tokenize

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

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

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

  • 将复数名词转换为单数
    我找到了一个名为 inflect 的图书馆这似乎做得很好,有人对此有任何经验吗?

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

  • 基于空格分词,将连续的空格转换为单个空格
    我认为这可以通过 Python 中的一些自定义字符串操作来实现,但可能有更好的方法。

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

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

最佳答案

我认为您想研究一个提供您描述的功能的全文搜索解决方案,而不是在 python 中实现您自己的功能。这个领域的两大开源参与者是 elasticsearchsolr .

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

这是一个包含一些有用内容的 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>

定义一个字段

<field indexed="true" name="text_body" stored="false" type="text_en"/>

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

关于python - 标记文本以在 Python 中进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403319/

相关文章:

python - 如何检测odoo中看板 View 的拖放事件?

python - 如何重写 django 模型删除方法以在删除时保存几个字段

python - 使用 PyODBC、Python 连接到 SQLite3 服务器

php - 将逗号分隔的字符串拆分为数组?

linux - 如何grep搜索字符串但从结果中省略字符串

python - 检查对话框是否已关闭的更快方法?

string - 如何管理大字符串

php - 谷歌搜索 API 后端

arrays - 如何从 n 个数组中找到公共(public)元素

string - 如何将网络客户端的 IP 转换为 Golang 中的字符串?