【问题标题】:Word similarity across a large array大数组中的单词相似度
【发布时间】:2017-08-10 04:16:22
【问题描述】:

我有一个非常大的字符串数组(32k 字左右),我想以一种有效的方式检查整个数组的相似性。我希望它以百分比返回。我也不知道阵列中有多少个点。我不知道最有效的方法是什么。我目前的想法是检查数组中每两个单词之间的相似度,然后平均该相似度。我希望找到一个更有效的解决方案。 这是我迄今为止尝试过的:

import java.util.*;
import org.apache.commons.lang3.StringUtils;   
public class Trial2 {

public static void main(String[] args) {
    ArrayList<Double> averageValues = new ArrayList<>();
    ArrayList<String> temp = new ArrayList<>(); //holds all the words in the list
    for(int i = 0; i < temp.size() - 1; i++) {
        double k = StringUtils.getLevenshteinDistance(temp.get(i), temp.get(i + 1));
        averageValues.add(k/(double)temp.get(i).length())
    }
    double average;
    for(int i = 0; i < averageValues.size(); i++) {
        average += averageValues.get(i);
    }
    average = average/averageValues.size();
}
}

假设我的临时列表已经满了。这段代码的问题在于它已经嵌入了 2 个 forloops,我不想点击 n^3。有没有其他方法可以解决这个问题

请帮忙。

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?现在,它读作“为我写这段代码”,这与 StackOverflow 无关。另外:这不是大数据问题(我编辑了那个标签)。请在最终关闭之前用更多细节编辑您的问题。
  • 对不起,我让它看起来那样。我只是想指出写的方向,而不是让别人为我写代码。

标签: java similarity


【解决方案1】:

对于以下内容,我们假设单个条目(例如单词)的长度没有增加。

您的算法在数组中的条目数量上只有 O(n),因为它只将每个条目与下一个条目进行比较(而不是与其他每个条目进行比较)。权衡是它(仅)提供了对总相似性的启发式估计。好:您的算法访问每个条目,因此每个条目至少对启发式结果有一些影响(但请参阅下面的统计信息)。

建议:

为避免增长成本,您可以为 averageValues 赋予一个与 temp 相等的初始大小(如果需要,则为 -1)。但是,如果您执行以下操作,甚至都不需要这样做。

您可以通过让第一个循环累积结​​果来消除第二个循环:

sumOfDifferences += k/(double)temp.get(i).length();

然后在循环之后:

average = sumOfDifferences/temp.size();

这可能会运行得更快,因为在您的版本中,如果当时正在运行另一个线程/进程,那么当第二个循环运行时,条目可能不再在缓存中。 这也可以让您删除averageValues ArrayList,因此不再有增长成本。

不是优化,而是要考虑:考虑除以(double)temp.get(i).length() 是否对您要实现的目标有意义。

从统计上讲,您总是与下一个条目进行比较可能会很麻烦。例如。如果对单词进行排序,将会有很大的偏差。考虑先随机化数组是否更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多