回复:[ICTCLAS] Re: ictclas4j 分词是 遇到 "月份牌" 三个字 就进入死循环了

35 Aufrufe
Direkt zur ersten ungelesenen Nachricht

彭亮

ungelesen,
10.04.2009, 04:06:0010.04.09
an ictclas
“月份牌”的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++;
     }
    }
 还有上面红色两行 删除 即可。
------------------ 原始邮件 ------------------
发件人: "Dancefire"<danc...@gmail.com>;
发送时间: 2009年4月9日(星期四) 中午11:30
收件人: "ictclas"<ict...@googlegroups.com>;
主题: [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

Dancefire

ungelesen,
10.04.2009, 14:29:4510.04.09
an ict...@googlegroups.com
我也认为不必特殊处理“月份”,应该是原作者在处理人民日报1月某些句子的时候发现月份出错了,于是干脆把他们合在一起不让它拆开了。类似的例子代码中还不少,其实都可以去掉。不过结论还得拿一个月的语料测试一下才知道是不是会降低准确性。

2009/4/10 彭亮 <bez...@gmail.com>:

Allen antworten
Antwort an Autor
Weiterleiten
0 neue Nachrichten