【问题标题】:Tokenize text for search in Python标记文本以在 Python 中进行搜索
【发布时间】:2012-11-04 09:28:55
【问题描述】:

寻找有关如何标记文本以进行搜索的策略,以及有关如何实施它们的一些想法。

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

我认为我们至少需要做以下事情:

  • 复数名词转单数
    我找到了一个名为 inflect 的库,它似乎做得很好,有没有人有这方面的经验?

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

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

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

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

【问题讨论】:

    标签: python string search elasticsearch tokenize


    【解决方案1】:

    我认为您希望研究提供您描述的功能的全文搜索解决方案,而不是在 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。

    【讨论】:

    • 我们实际上正在使用 ElasticSearch,并且我们确实使用它的工具进行基本的标记化。我们希望单独执行此操作,因为在标记化之后,我们将需要应用一些非常复杂的语义分析来从文本中获取含义。我们希望能够灵活地准确标记我们指定的方式,以及以我们自己的格式存储标记并附加我们自己的数据注释的便利。虽然我想这个逻辑可能会被误导。
    • @ClayWardell 我主要是一个 Solr 人,它为您提供了一个完整的分析链,用于在 Java 中定义自己的标记化。例如很多语言的分词非常复杂,所以他们在 solr 中有自己的分词器。至于另一个问题……我的同事说,您可以将所谓的有效负载附加到具有与令牌相关联的任意元数据的令牌上。虽然不知道 ES。
    • 我们绝对需要的是每个令牌的单个(大型)数据库记录,可随时访问和修改,其中包含与该令牌使用相关的所有内容。我认为这排除了在文档被索引时仅使用 ES 标记化来处理它们。我们也许可以使用 ES 的分析模块来分析文本而不对其进行索引,然后单独处理每个令牌以构建/更新令牌的数据库记录...您觉得这是个好主意吗?
    • 您能否设置一个弹性搜索实例来将文本处理为令牌?你能从 Elasticsearch 中取出代币吗?
    • @ClayWardell elasticsearch 遗憾的是目前不支持 per-token 有效负载,因为它基于旧版本的 lucene。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多