“月份牌”的bug解决了:
位置:org.ictclas4j.segment.GraphGenerate类中
源代码:在90行左右
WordItem wi = null;
for (; j <= atoms.size(); j++) {
int totalFreq = 0;
wi = dict.getMaxMatch(word);
if (wi != null) {
// find it
if (word.equals(wi.getWord())) {
ArrayList<WordItem> wis = dict.getHandle(word);
for (WordItem w : wis)
totalFreq += w.getFreq();
// 1年内,1999年末
if (word.length() == 2 && segGraph.getSize() > 0) {
SegNode g2 = segGraph.getLast();
if (Utility.isAllNum(g2.getWord()) || Utility.isAllChinese(g2.getWord())
&& (g2.getWord().indexOf("年") == 0 || g2.getWord().indexOf("月") == 0)) {
if ("末内中底前间初".indexOf(word.substring(1)) != -1)
break;
}
}
// 只有一个性词,存贮它
SegNode sg = null;
if (wis.size() == 1)
sg = new SegNode(i, j,wis.get(0).getHandle(),totalFreq , word);
else
sg = new SegNode(i, j, 0,totalFreq , word);
segGraph.insert(sg, true);
}
if (flag) //此两行不应该放在这,应该放到这个for循环的外面,否则“月份”后面如果有词构成一个词的话会出错如“月份牌”是一个词。
i++; //就会出错
if (j < atoms.size()) {
String word2 = atoms.get(j).getWord();
word += word2;
} else
break;
} else
break;
}
另外 我仔细看了这个类的代码 ,发现根本不用在这个类中单独处理“月份”,一样可以识别出 “月份”一词,因为词典中有。而且这个地方处理了 也不会提高效率...当然 这个个人只见... 所以可以直接把
boolean flag = false;
if (j < atoms.size()) {
Atom a2 = atoms.get(j);
if ("月".equals(word) && "份".equals(a2.getWord())) {
segGraph.delete(i, j);
segGraph.delete(i + 1, j + 1);
word += a2.getWord();
flag = true;
j++;
}
}
还有上面红色两行 删除 即可。
------------------ 原始邮件 ------------------
发送时间: 2009年4月9日(星期四) 中午11:30
主题: [ICTCLAS] Re: ictclas4j 分词是 遇到 "月份牌" 三个字 就进入死循环了
在ICTCLAS中,原子切分的时候,针对“月份”进行了特殊处理,防止这两个字拆开。ICTCLAS4j是根据ICTCLAS改写的,因此应该具有相同的逻辑。那么很有可能是原子切分的时候,针对“月份”这两个字进行特殊处理部分的代码有bug。你可以到响应的位置寻找bug。
2009/4/9 彭亮 <
bez...@gmail.com>:
> 跟踪了一下,是NShortPath类 里面
> while (curNode > 0) {
> SegTag.println2Err("Test ----3");
> // Get its parent and store them in nParentNode,nParentIndex
> QueueNode qn = parent[curNode].pop(false);
> if (qn == null)
> qn = parent[curNode].top();
> if (qn != null) {
> curNode = qn.getParent();
> curIndex = qn.getIndex();
> }
> if (curNode > 0)
> queResult.push(new QueueNode(curNode, curIndex, 0));
> }
> 这个循环 进入了 死循环 跳不出来了...
>
> 因为我是写 一个搜索工具 用到ictclas4j 没仔细研究过ictclas4j 的代码 希望各位大大 帮忙解决一下
>
> ps:ictclas4j的 分词有点慢啊...
--
Tao Wang
Microsoft Certified Technology Specialist
CCNA