java - 创建单词出现计数 vector 的快速方法

标签 java

我有一个HashMap<String, Integer> vocabulary ,包含单词及其权重(不重要,这里只有字符串重要):

   vocabulary = ["this movie"=5, "great"=2, "bad"=2, ...]

以及作为列表的标记化字符串:

String str = "this movie is great";
List<String> tokens = tokenize(str) // tokens = ["this", "movie", "is", "great", "this movie", "is great", ...]

现在我需要一种快速方法来为这个标记化字符串创建一个 vector ,该 vector 对词汇表的每个条目进行计数,以及该单词在标记化字符串中出现的次数

HashMap<String, Integer> vec = new HashMap();
Iterator it = vocabulary.entrySet().iterator();
while (it.hasNext()) {
   Map.Entry pair = (Map.Entry) it.next();
   String word = (String) pair.getKey();
   int count = 0;
   for (String w : tokens) {
      if (w.equals(word)) {
         count += 1;
      }
   }
   vec.put(word, count);
}

所以,vec应该是["this movie"=1, "great"=1, bad = 0]

有没有更好的方法来做到这一点?我在更大的上下文中遇到性能问题,并假设问题一定出在这里,因为词汇表大约有 300,000 个条目。正常的标记化文本包含大约 100 个单词。

词汇表是hashMap有问题吗?

最佳答案

统计tokens每个元素出现的次数:

Map<String, Long> tokensCount = tokens.stream().collect(
  Collectors.groupingBy(Function.identity(), Collectors.counting()));

然后只需从此 map 查找而不是内部循环即可:

count = tokensCount.getOrDefault(word, 0L).intValue();

这更快,因为在映射中的查找时间复杂度为 O(1),而迭代标记查找相等元素的时间复杂度为 O(# 个标记)。

<小时/>

另请注意,除了获取其 key 之外,您没有使用 pair,因此您可以迭代 vocabulary.keySet(),而不是 vocabulary。条目集()

此外,如果您没有使用原始迭代器,则不需要显式强制转换:

Iterator<Map.Entry<String, Integer>> it = ...
<小时/>

编辑,现在您已经添加了两个集合的相对大小:

您可以简单地迭代标记,并查看词汇是否包含该内容:

Map<String, Integer> vec = new HashMap<>();
for (String token : tokens) {
  if (vocabulary.contains(token)) {
    vec.merge(token, 1, (old,v) -> old+v);
  }
}

关于java - 创建单词出现计数 vector 的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48005821/

相关文章:

javascript - Spring Boot REST - 使用 HTTP POST JSON 数据插入带有外键的行

java - 如何在jsp中获取动态创建的文本框的值

java - 将相同的对象添加到 Set<E>

java - 屏幕分辨率

java - 下载PDF时如何关闭chrome浏览器中的下载弹出窗口

java - 是否可以从 Kotlin 注释链接 Java 方法?

java - 检查 count 是否在每一千之后包含 ,

Java InetAddress.getHostName() 需要很长时间才能执行

java - Gradle同步失败: Build tools download failed with code 2

java - log4j - 指向多个 log4j.properties 文件之一