问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

lucene怎么使用nlpir进行分词

发布网友 发布时间:2022-04-23 06:47

我来回答

2个回答

热心网友 时间:2022-06-16 23:56

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Lucene.Net.Analysis;

namespace Lucene.Net.Analysis.DChinese
{
[StructLayout(LayoutKind.Explicit)]
public struct result_t
{
[FieldOffset(0)]
public int start;
[FieldOffset(4)]
public int length;
[FieldOffset(8)]
public int sPos1;
[FieldOffset(12)]
public int sPos2;
[FieldOffset(16)]
public int sPos3;
[FieldOffset(20)]
public int sPos4;
[FieldOffset(24)]
public int sPos5;
[FieldOffset(28)]
public int sPos

热心网友 时间:2022-06-16 23:56

  词法分析是lucene的一个模块,lucene自带的中文分词器(analyzer)一般效果不是很理想。现在项目中用的分词工具是北理工的NLPIR,但是NLPIR没有一个现成的lucene分词器(analyzer)实现类。这里就需要自己来写一个比较简短的基于NLPIR的analyzer实现类。
  不同的Analyzer就是组合不同的Tokenizer和TokenFilter得到最后的TokenStream。以StandardAnalyzer为例。以下代码截图来自StandardAnalyzer源码。红框中可以看到TokenFilter使用的是装饰者模式,Tokenizer和TokenFilter都继承自TokenStream类。
  import com.sun.jna.Library;
  import com.sun.jna.Native;
  
  public class NLPTool {
  
  public interface CLibrary extends Library {
  // 定义并初始化接口的静态变量
  CLibrary Instance = (CLibrary) Native.loadLibrary("code/NLPIR",
  CLibrary.class);
  public int NLPIR_Init(String sDataPath, int encoding,
  String sLicenceCode);
  public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
  public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
  boolean bWeightOut);
  public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
  boolean bWeightOut);
  public int NLPIR_AddUserWord(String sWord);// add by qp 2008.11.10
  public int NLPIR_DelUsrWord(String sWord);// add by qp 2008.11.10
  public String NLPIR_GetLastErrorMsg();
  public void NLPIR_Exit();
  }
  
  public static String SegAndPos(String sInput,int type) {
  String argu = ".";
  String nativeBytes = "";
  int charset_type = 1;
  CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
  try {
  // CLibrary.Instance.NLPIR_AddUserWord("奇虎360 nt");
  nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, type); //第二个参数为1表示,进行词性标注。
  CLibrary.Instance.NLPIR_Exit();
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  return nativeBytes;
  }
  }

  [java] view plain copy
  import java.io.Reader;
  import org.apache.lucene.analysis.util.CharTokenizer;
  import org.apache.lucene.util.Version;
  
  /*
  *@author:xyd
  *@department:CasCeep
  */
  public class MyChineseTokenizer extends CharTokenizer {
  
  public MyChineseTokenizer(Reader in) {
  super(Version.LUCENE_47, in);
  }
  
  public MyChineseTokenizer(AttributeFactory factory, Reader in) {
  super(Version.LUCENE_47, in);
  }
  
  /*
  * @see org.apache.lucene.analysis.util.CharTokenizer#isTokenChar(int)
  */
  @Override
  protected boolean isTokenChar(int c) {
  return !Character.isWhitespace(c);
  }
  }

  [java] view plain copy
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.Reader;
  import java.io.StringReader;
  import lucene.NLPTool;
  import org.apache.lucene.analysis.Analyzer;
  import org.apache.lucene.analysis.TokenStream;
  import org.apache.lucene.analysis.Tokenizer;
  import org.apache.lucene.analysis.core.LowerCaseFilter;
  import org.apache.lucene.analysis.core.StopFilter;
  import org.apache.lucene.analysis.standard.StandardFilter;
  import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
  import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
  import org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute;
  import org.apache.lucene.analysis.tokenattributes.TypeAttribute;
  import org.apache.lucene.analysis.util.CharArraySet;
  import org.apache.lucene.util.Version;
  
  /*
  *@author:xyd
  *@department:CasCeep
  */
  public final class MyChineseAnalyzer extends Analyzer {
  private CharArraySet stopWords;
  /**
  * An array containing some common English words that are not usually useful
  * for searching.
  */
  public static final String[] CHINESE_ENGLISH_STOP_WORDS = {"我", "的" };
  
  /** Builds an analyzer which removes words in ENGLISH_STOP_WORDS. */
  public MyChineseAnalyzer() {
  this.stopWords = StopFilter.makeStopSet(Version.LUCENE_47,
  CHINESE_ENGLISH_STOP_WORDS);
  
  }
  
  @Override
  protected TokenStreamComponents createComponents(String arg0, Reader reader) {
  // TODO Auto-generated method stub
  BufferedReader br = new BufferedReader(reader);
  Tokenizer tokenizer = null;
  TokenStream tokFilter = null;
  try {
  String text = br.readLine();
  String string = NLPTool.SegAndPos(text, 0);
  // 分词中间加入了空格
  tokenizer = new MyChineseTokenizer(new StringReader(string));
  tokFilter = new StandardFilter(Version.LUCENE_47, tokenizer);
  tokFilter = new LowerCaseFilter(Version.LUCENE_47, tokFilter);
  // 使用stopWords进行过滤
  tokFilter = new StopFilter(Version.LUCENE_47, tokFilter, stopWords);
  } catch (IOException e) {
  e.printStackTrace();
  }
  return new TokenStreamComponents(tokenizer, tokFilter);
  }
  
  public static void main(String[] args) throws IOException {
  String string = "我的老师在中国科学院工作";
  Analyzer analyzer = new MyChineseAnalyzer();
  TokenStream tokenStream = analyzer.tokenStream("field",
  new StringReader(string));
  tokenStream.reset();
  while (tokenStream.incrementToken()) {
  // 文本属性
  CharTermAttribute attribute = tokenStream
  .addAttribute(CharTermAttribute.class);
  // 偏移量
  OffsetAttribute offsetAtt = tokenStream
  .addAttribute(OffsetAttribute.class);
  // 距离增加量
  PositionIncrementAttribute positionAttr = tokenStream
  .addAttribute(PositionIncrementAttribute.class);
  // 距离
  PositionLengthAttribute posL = tokenStream
  .addAttribute(PositionLengthAttribute.class);
  // 词性
  TypeAttribute typeAttr = tokenStream
  .addAttribute(TypeAttribute.class);
  System.out.println(offsetAtt.startOffset() + ":"
  + offsetAtt.endOffset() + "\t" + attribute + "\t"
  + typeAttr.type() + "\t" + posL.getPositionLength() + "\t"
  + positionAttr.getPositionIncrement());
  }
  }
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
探探直播间的入口在v4.1.9.3版本中具体位置是哪里? ...一个微信号,但是也没有绑定手机号码跟QQ邮箱,怎么才能找回来... ...号是以前的手机号码,微信登不上怎么找回微信密码?_百度问一问 ...一条黑花,红色大蟒蛇把我手腕咬一口没出血? 求轻松赚一元的软件,多推荐几个,好的话有奖励 凉粉做的太稀怎么补救(煮好的凉粉可以冰箱冷藏多少天) bilibili会员怎么升级快? 小米cc9支持无线充电吗? 为什么狗突然乱叫乱跑钻角落 如何用烤鸭箱烤鸭子 民主生活会征求意见表意见怎么写 中文分词的应用 Python3 有什么推荐的中文分词器 专题民主生活会征求意见表怎么填 中文在线分词,有哪些网站或者工具可以直接看分词效果 党员领导干部民主生活会征求意见反馈怎么写 redis-search 有没有php版的?php的什么分词工具比较好 谁来推荐一个JAVA的分词工具 什么是中文分词及中文分词的应用 分词工具 cipp js 中科院分词 哪个好 python 中文分词 工具 哪个最好 好用的分词工具有哪些? 民主生活会征求意见 没意见怎么办 中文分词器哪个比较好用 保持党的纯洁性专题民主生活会征求意见表 怎么填 中文分词工具哪个好用 有哪些比较好的中文分词方案? 怎么填写关于领导的征求意见表 “加强作风建设,密切联系群众”民主生活会征求意见表怎么写 党委民主生活会征求意见表怎么写 请问如何填写2016度科级党员干部民主生活会征求意见表 中文词频统计软件 办公室民主生活会意见汇总 中文分词的原理是什么? 基层社区民主生活会意见? 如何根据多语言自动选用不同的分词器 讲重作专题警示教育专题民主生活会征求意见表怎么填 SEM里面分词到底该如何分,有什么好的分词工具吗? 专题民主生活会征求意见表在理解力,执行力,落实力上的差距应怎样写 有什么好的做词云图的工具,可以看关键词词频的那种? 关于征求对县商务局领导班子2015年度民主生活会意见的函 基于语料库的词块分析需要用到的软件有哪些 如何填写党员领导干部民主生活会征求意见表 在C语言中,char型数据在内存中的存储形式是() 谁有中班音乐<会跳舞的跳跳糖>的词曲啊 会跳舞的跳跳糖 谁有歌曲》???急需 091205快乐大本营里super brother中的陈俞廷吃完跳跳糖开始会跳舞的时候放的那段音乐是什么 好的电销呼叫软件平台有哪些? 艺术大家一起来跳舞教案反思 深圳公司法人变更的流程有哪些
  • 焦点

最新推荐

猜你喜欢

热门推荐