LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: awingA

请问如何知道中文一个文档中一个词出现的次数?

[复制链接]
发表于 2004-12-15 06:09:39 | 显示全部楼层
kiron兄说的是。好像我们回的帖子里,没有一个是用中文的例子的。sed和awk对中文字串的处理吃力,可能需要转换成unicode码。但我没有仔细研究过。 希望大家对这一帖子详加讨论。

其实楼主提出了一个很好的问题。就算是英文的都不好解决。
比如:
----------------------
abc abc abcabc abcabcabc
aabc aaabccc abc abc
----------------------
这样一个文件,前后加空白是无法正确匹配的。
发表于 2004-12-15 06:54:24 | 显示全部楼层
倒是找到了一个简单的方法:

  1. cat find_ward|sed 's/[[:blank:]]/\n/g'|sed -n '/^abc$/p' | wc -l
复制代码

思路是将所有的词全部打成行,再用sed匹配全词。
发表于 2004-12-15 07:45:08 | 显示全部楼层
awk 的方法:

  1. cat find_ward| awk '{for(i=1;i<=NF;i++)if($i == "abc")print $i}' | wc -l
复制代码

个人认为awk要简单些。
发表于 2004-12-15 13:07:03 | 显示全部楼层
最初由 yongjian 发表
如果是这样的文件呢:
abc bbb ddd abcabc abcabcabc
abc ccc ddd www abc
abcabc
如果只要abc的话, 次数是3,但上面的方法都不行。用perl 的regexp会简单些。
不用perl也简单啊
这样行不
  1. sed 's/[color=red]\<[/color]abc[color=red]\>[/color]/&\n/g' 1.txt|grep 'abc'|wc -l
复制代码

现在不在linux下,不好测试
发表于 2004-12-15 13:41:28 | 显示全部楼层
嘿嘿, 老兄这样是不行的.
发表于 2004-12-15 15:26:00 | 显示全部楼层
yongjian兄思维严谨,值得称赞
我的思想和yongjian兄的一样,看样子我是不能再有更好的办法了
PS: perl的正规表达式比UNIX上通用的正规表达式更为复杂有效,可惜我不会perl,有兄弟能写出简洁的办法来的话就更完美了
发表于 2004-12-15 16:01:13 | 显示全部楼层
lol. Perl 的\b可以简单的区分词的边界, 所以很容易解决这类问题. 写了个python的, 还是有点问题, 还得好好研究研究.
发表于 2004-12-16 01:39:14 | 显示全部楼层
推广这个问题,再想深点,来看看这个用正则怎么表示。文件如下:
------------------------------
abc abc abcabc abcabcabc abc
abcc abccc aaabc aabc
abc aabbcc abcbcabc abc
------------------------------
要求:
1. 不能再用拆行处理的方法。
2. 只能用sed
3. 只能用regexp.
其实,最终的目的是找出最简练的正则表达式来分辨出”abc“和”含有abc“的词。
结果是只能输出”abc“词,去掉所有那些不是”abc“的词。
发表于 2004-12-16 16:48:33 | 显示全部楼层
最初由 yongjian 发表
嘿嘿, 老兄这样是不行的.
sed 's/\<abc\</&\n/g' 1.txt|grep '\<abc\<'|wc -l

这样就可以了
发表于 2004-12-16 16:48:48 | 显示全部楼层
最初由 yongjian 发表
嘿嘿, 老兄这样是不行的.
sed 's/\<abc\</&\n/g' 1.txt|grep '\<abc\<'|wc -l

这样就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表