【问题标题】:Solr / Lucene: Filter to Convert "Word-Numbers" to NumbersSolr / Lucene:过滤以将“字数”转换为数字
【发布时间】:2012-03-21 13:58:37
【问题描述】:

我将 Solr 用作大型音乐艺术家/曲目信息语料库的搜索前端。

在 Lucene/Solr 中,是否有过滤器或其他方法可以在索引时将“五”之类的“字数”转换为它们的等效数字(“5”)?

例如,搜索“Ben Folds 5”应返回“Ben Folds 5”作为结果。

有 PatternReplaceFilterFactory 但在正则表达式中做这一切似乎有点矫枉过正。

【问题讨论】:

  • 您需要使用同义词。这可以在索引时间、查询时间或两者同时完成。
  • 我会在索引时使用同义词分析器进行操作。我不确定这在 solr 中映射到什么,但有人会知道。
  • @Tass 感谢各位的提示;我查看了SynonymFilter,但它似乎需要一个带有显式映射的文本文件,这对于所有可能的数字来说都是笨拙的。我错过了什么吗?
  • 这意味着您必须在自定义 TokenFilter 中手动完成。
  • @Spoom,对于所有可能的数字肯定会很笨拙,但在这种情况下我们谈论的是多少个数字?

标签: search filter solr lucene indexing


【解决方案1】:

这是有效的代码(我过去使用过):

import java.util.*;

class ConvertWordToNumber {

    public static String WithSeparator(long number) {
        if (number < 0) {
            return "-" + WithSeparator(-number);
        }
        if (number / 1000L > 0) {
            return WithSeparator(number / 1000L) + ","
                    + String.format("%1$03d", number % 1000L);
        } else {
            return String.format("%1$d", number);
        }
    }

    private static String[] numerals = { "zero", "one", "two",
            "three", "four", "five", "six", "seven", "eight", "nine", "ten",
            "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen",
            "seventeen", "eighteen", "ninteen", "twenty", "thirty", "forty",
            "fifty", "sixty", "seventy", "eighty", "ninety", "hundred" };

    private static long[] values = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
            13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100 };

    private static ArrayList<String> list = new ArrayList<String>(
            Arrays.asList(numerals));

    public static long parseNumerals(String text) throws Exception {
        long value = 0;
        String[] words = text.replaceAll(" and ", " ").split("\\s");
        for (String word : words) {
            if (!list.contains(word)) {
                throw new Exception("Unknown token : " + word);
            }

            long subval = getValueOf(word);
            if (subval == 100) {
                if (value == 0)
                    value = 100;
                else
                    value *= 100;
            } else
                value += subval;
        }

        return value;
    }

    private static long getValueOf(String word) {
        return values[list.indexOf(word)];
    }

    private static String[] words = { "trillion", "billion", "million", "thousand" };
    private static long[] digits = { 1000000000000L, 1000000000L, 1000000L, 1000L };

    public static long parse(String text) throws Exception {
        text = text.toLowerCase().replaceAll("[\\-,]", " ").replaceAll(" and "," ");
        long totalValue = 0;
        boolean processed = false;
        for (int n = 0; n < words.length; n++) {
            int index = text.indexOf(words[n]);
            if (index >= 0) {
                String text1 = text.substring(0, index).trim();
                String text2 = text.substring(index + words[n].length()).trim();

                if (text1.equals(""))
                    text1 = "one";

                if (text2.equals(""))
                    text2 = "zero";

                totalValue = parseNumerals(text1) * digits[n] + parse(text2);
                processed = true;
                break;
            }
        }

        if (processed)
            return totalValue;
        else
            return parseNumerals(text);
    }


    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        System.out.print("Number in words : ");
        String numberWordsText = in.nextLine();
        System.out.println("Value : " + 
                ConvertWordToNumber.WithSeparator(
                ConvertWordToNumber.parse(numberWordsText)));
    }
}

取自here

您可以使用它来构建自己的 Solr 过滤器。
这是一篇不错的帖子:

http://robotlibrarian.billdueber.com/building-a-solr-text-filter-for-normalizing-data/

请在完成后将其贡献给 Solr 社区。 您可以编写自己的 wiki 页面。

要开始,只需点击与此类似的链接:
http://wiki.apache.org/solr/SolrWordToNumberConverter

【讨论】:

  • 谢谢!我会在某个时候解决这个问题。目前,我已经通过使用较低的匹配阈值进行模糊搜索来解决这个问题。如果我制作这样的过滤器,我一定会回馈给它。
  • @Marko,这可以通过 solr config 或任何分析器实现吗?因为如果我想将它用于多种语言,那将非常困难,而且代码对于多种语言来说也太大了。所以可能是 表现 打破了我们的她。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2016-04-25
  • 2022-01-22
  • 2011-06-16
  • 2018-01-02
  • 2017-11-10
相关资源
最近更新 更多