-1

我正在做一个项目,从文本文档中提取所有单词,计算它们出现的次数,按字母顺序排列,然后打印出来。我已经完成了所有这些步骤,但我的输出仍然存在一些问题。
- 我需要从列表中删除重复的单词,而不是打印:

Hello-3
Hello-2
Hello-1
Hi-2
Hi-1

就像现在一样,它只会打印:

Hello-3
Hi-2

- 我要做的第二件事是从文本中删除所有数字和标点符号: 如果输入是:

This3 
test 
is 
a 
2nd! 
Test. 
Te 
st

然后我们会计算 '<code>this' 出现 1 次,'<code>is' 出现 1 次,'<code>a' 出现 1 次,'<code>nd' 出现 1 次,'<code> 出现 2 次>test','<code>te' 出现一次,'<code>st' 出现一次。

4

1 回答 1

1

使用哈希表将单词存储为键,将计数存储为值

哈希表(称为关联数组或其他语言中的 dict)仅允许唯一键

这个 perl one liner 演示了这个概念

perl -n -e '$a{$_}++ for(split(/\s+/)); END { use Data::Dumper; print Dumper(\%a);}' corpus.txt

这是 python 中的相同类型的东西

counter = dict()
for line in open("corpus.txt").readlines():
    for word in line.split(" "):
        v = counter.get(word, 0)
        counter[word] = v + 1

for word in sorted(counter.keys()):
    print "%d \t %s" % (counter[word], word)

您刚刚编辑了您的问题,说它是在 java 中。在java中,你可以使用HashMap类型,这里是一个示例声明

HashMap<String, Integer> lookup = new HashMap<Character, Integer>();

至于您问题的第二部分,正则表达式可能会起作用-尽管删除您所描述的某些字符实际上很难严格执行。

像这样的正则表达式替换

s/[^\w\s]//g

方法

  • s 表示替换,s/1/2 表示用 1 替换 2
  • [开始一个字符类
  • ^ 在字符类中匹配与该类相反的内容
  • \w 字母
  • \s 空格
  • ] 字符类结束
  • 最后的 g 是一个“全局”标志,重复应用于输入

所以匹配任何不是空格或字母的东西并用任何东西替换,即删除它

在上面的 perl 中使用

perl -n -e 's/[^\w\s]//g; $a{$_}++ for(split(/\s+/)); END { use Data::Dumper; print Dumper(\%a);}' corpus.txt

python、java等语言也有正则表达式系统

于 2013-10-23T14:12:00.363 回答