【问题标题】:How to search for a string and similar word in a text?如何在文本中搜索字符串和相似词?
【发布时间】:2015-08-17 10:28:28
【问题描述】:

我必须在文本文件中查找单词“age”和类似的单词。

我有以下句子:

  • 18岁
  • 51岁的男人
  • 男性年龄在 25 到 50 岁之间
  • 5 到 75 岁之间。(带点)
  • 5 到 75 岁之间,(带逗号)
  • 代理名称是 xyz(代理包含年龄)。

String.contains 在每种情况下始终返回 true。我的要求是通过前五句话,在最后一种情况下返回 false。

我将通过编写一些包含一堆字符串“age”、“age”的代码来解决这个问题。 、“年龄”、“年龄”、“年龄”等。

有没有更好的方法来解决这个问题。

【问题讨论】:

  • 也许你应该使用词干提取,或者计算编辑距离(simmetrics 提供)
  • 您需要使用全文搜索和文本分析来计算相似度
  • 一个容易测试的东西是“LevenshteinDistance - 将一个字符串更改为另一个字符串所需的更改次数”,Apache StringUtils 有一个实现

标签: java string contain


【解决方案1】:

如果你使用正则表达式,你必须把所有的可能。

string.matches("(?i).*\\bage[ds]?\\b.*");

【讨论】:

  • 那么,“你几岁?” “年龄?四十!” ... 行不通。
  • 现在,它会string.matches("(?i).*\\bage[ds]?\\b.*");
【解决方案2】:

一个简单的解决方案(昂贵)如下:

  1. 标记每一行(例如,用“”分隔,甚至是非字母数字字符,这已经删除了标点符号)。
  2. 计算每个单词到单词年龄的编辑距离
  3. 如果当前单词的编辑距离很小(例如,bellow 2),则返回行

两个字符串的编辑距离是使一个字符串等于另一个字符串所需的编辑(添加、删除和替换)次数。您可以在 simmetrics 库或其他地方找到编辑距离的实现。

另一种选择是在第 2 步中对单词进行词干化,并使用包含词年龄的词干化(也很昂贵)。

如果您已经知道所有可接受的答案(或至少知道它们的模式),请选择Avinash Raj's answer

【讨论】:

【解决方案3】:

你需要的是一个正则表达式(或正则表达式)

Here's一个非常详细的正则表达式定义和在Java中的使用,可以用matches(String Regex) method of String class来完成。

对于您的示例,它可能(通常)是:myString.matches(".*age? .*")

注意转义 Java 中的特殊字符。你可以试试你的正则表达式here。上面的例子我没有做,但是你可以试试:)

详细说明:

  • .* : 句子可以以任何东西开头
  • age : 句子中必须包含'age'
  • ? : 年龄后面可以跟零个或一个字符
  • :然后是空格
  • .*: 然后一切又来了

希望对您有所帮助。

【讨论】:

  • 是的,完全可以。这就是为什么我写了可以,而不是应该。
猜你喜欢
  • 2016-06-04
  • 2018-12-18
  • 2022-11-14
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多