- 浏览: 129717 次
- 性别:
- 来自: 福建省莆田市
文章分类
最新评论
-
houruiming:
tks for your info which helps m ...
setcontent和setcontentobject用的是同一片内存 -
turingfellow:
in.tftpd -l -s /home/tmp -u ro ...
commands -
turingfellow:
LINUX下的网络设置 ifconfig ,routeLINU ...
commands -
turingfellow:
安装 linux loopbackyum install um ...
commands
using System;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using SF.Snowball.Ext;
using System.Collections.Generic;
using System.Collections;
using OpenNLP.Tools.PosTagger;
namespace Lucene.Net.Analysis.Snowball
{
//词汇的实体类,包括两个属性
public class myEwordEntity
{
public string txtWord;//词的文本
public string stemroot;//被过滤后词的词根
public string posWord;//词的词性
public int token_begin;//在文章中的开始位置
public int token_end;//在文章中的结束位置
public myEwordEntity()
{
txtWord = string.Empty;
posWord = string.Empty;
stemroot = string.Empty;
token_begin = 0;
token_end = 0;
}
}
public class Stemmer
{
private char[] b;
private int i, /* offset into b */
i_end, /* offset to end of stemmed word */
j, k;
private static int INC = 50;
/* unit of size whereby b is increased */
public Stemmer()
{
b = new char[INC];
i = 0;
i_end = 0;
}
/**
* Add a character to the word being stemmed. When you are finished
* adding characters, you can call stem(void) to stem the word.
*/
public void add(char ch)
{
if (i == b.Length)
{
char[] new_b = new char[i + INC];
for (int c = 0; c < i; c++)
new_b[c] = b[c];
b = new_b;
}
b[i++] = ch;
}
/** Adds wLen characters to the word being stemmed contained in a portion
* of a char[] array. This is like repeated calls of add(char ch), but
* faster.
*/
public void add(char[] w, int wLen)
{
if (i + wLen >= b.Length)
{
char[] new_b = new char[i + wLen + INC];
for (int c = 0; c < i; c++)
new_b[c] = b[c];
b = new_b;
}
for (int c = 0; c < wLen; c++)
b[i++] = w[c];
}
/**
* After a word has been stemmed, it can be retrieved by toString(),
* or a reference to the internal buffer can be retrieved by getResultBuffer
* and getResultLength (which is generally more efficient.)
*/
public string stemerToString()
{
return new String(b, 0, i_end);
}
/**
* Returns the length of the word resulting from the stemming process.
*/
public int getResultLength()
{
return i_end;
}
/**
* Returns a reference to a character buffer containing the results of
* the stemming process. You also need to consult getResultLength()
* to determine the length of the result.
*/
public char[] getResultBuffer()
{
return b;
}
/* cons(i) is true <=> b[i] is a consonant. */
private bool cons(int i)
{
switch (b[i])
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u': return false;
case 'y': return (i == 0) ? true : !cons(i - 1);
default: return true;
}
}
/* m() measures the number of consonant sequences between 0 and j. if c is
a consonant sequence and v a vowel sequence, and <..> indicates arbitrary
presence,
<c><v> gives 0
<c>vc<v> gives 1
<c>vcvc<v> gives 2
<c>vcvcvc<v> gives 3
....
*/
private int m()
{
int n = 0;
int i = 0;
while (true)
{
if (i > j) return n;
if (!cons(i)) break; i++;
}
i++;
while (true)
{
while (true)
{
if (i > j) return n;
if (cons(i)) break;
i++;
}
i++;
n++;
while (true)
{
if (i > j) return n;
if (!cons(i)) break;
i++;
}
i++;
}
}
/* vowelinstem() is true <=> 0,...j contains a vowel */
private bool vowelinstem()
{
int i;
for (i = 0; i <= j; i++)
if (!cons(i))
return true;
return false;
}
/* doublec(j) is true <=> j,(j-1) contain a double consonant. */
private bool doublec(int j)
{
if (j < 1)
return false;
if (b[j] != b[j - 1])
return false;
return cons(j);
}
/* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant
and also if the second c is not w,x or y. this is used when trying to
restore an e at the end of a short word. e.g.
cav(e), lov(e), hop(e), crim(e), but
snow, box, tray.
*/
private bool cvc(int i)
{
if (i < 2 || !cons(i) || cons(i - 1) || !cons(i - 2))
return false;
int ch = b[i];
if (ch == 'w' || ch == 'x' || ch == 'y')
return false;
return true;
}
private bool ends(String s)
{
int l = s.Length;
int o = k - l + 1;
if (o < 0)
return false;
char[] sc = s.ToCharArray();
for (int i = 0; i < l; i++)
if (b[o + i] != sc[i])
return false;
j = k - l;
return true;
}
/* setto(s) sets (j+1),...k to the characters in the string s, readjusting
k. */
private void setto(String s)
{
int l = s.Length;
int o = j + 1;
char[] sc = s.ToCharArray();
for (int i = 0; i < l; i++)
b[o + i] = sc[i];
k = j + l;
}
/* r(s) is used further down. */
private void r(String s)
{
if (m() > 0)
setto(s);
}
/* step1() gets rid of plurals and -ed or -ing. e.g.
caresses -> caress
ponies -> poni
ties -> ti
caress -> caress
cats -> cat
feed -> feed
agreed -> agree
disabled -> disable
matting -> mat
mating -> mate
meeting -> meet
milling -> mill
messing -> mess
meetings -> meet
*/
private void step1()
{
if (b[k] == 's')
{
if (ends("sses"))
k -= 2;
else if (ends("ies"))
setto("i");
else if (b[k - 1] != 's')
k--;
}
if (ends("eed"))
{
if (m() > 0)
k--;
}
else if ((ends("ed") || ends("ing")) && vowelinstem())
{
k = j;
if (ends("at"))
setto("ate");
else if (ends("bl"))
setto("ble");
else if (ends("iz"))
setto("ize");
else if (doublec(k))
{
k--;
int ch = b[k];
if (ch == 'l' || ch == 's' || ch == 'z')
k++;
}
else if (m() == 1 && cvc(k)) setto("e");
}
}
/* step2() turns terminal y to i when there is another vowel in the stem. */
private void step2()
{
if (ends("y") && vowelinstem())
b[k] = 'i';
}
/* step3() maps double suffices to single ones. so -ization ( = -ize plus
-ation) maps to -ize etc. note that the string before the suffix must give
m() > 0. */
private void step3()
{
if (k == 0)
return;
/* For Bug 1 */
switch (b[k - 1])
{
case 'a':
if (ends("ational")) { r("ate"); break; }
if (ends("tional")) { r("tion"); break; }
break;
case 'c':
if (ends("enci")) { r("ence"); break; }
if (ends("anci")) { r("ance"); break; }
break;
case 'e':
if (ends("izer")) { r("ize"); break; }
break;
case 'l':
if (ends("bli")) { r("ble"); break; }
if (ends("alli")) { r("al"); break; }
if (ends("entli")) { r("ent"); break; }
if (ends("eli")) { r("e"); break; }
if (ends("ousli")) { r("ous"); break; }
break;
case 'o':
if (ends("ization")) { r("ize"); break; }
if (ends("ation")) { r("ate"); break; }
if (ends("ator")) { r("ate"); break; }
break;
case 's':
if (ends("alism")) { r("al"); break; }
if (ends("iveness")) { r("ive"); break; }
if (ends("fulness")) { r("ful"); break; }
if (ends("ousness")) { r("ous"); break; }
break;
case 't':
if (ends("aliti")) { r("al"); break; }
if (ends("iviti")) { r("ive"); break; }
if (ends("biliti")) { r("ble"); break; }
break;
case 'g':
if (ends("logi")) { r("log"); break; }
break;
default:
break;
}
}
/* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */
private void step4()
{
switch (b[k])
{
case 'e':
if (ends("icate")) { r("ic"); break; }
if (ends("ative")) { r(""); break; }
if (ends("alize")) { r("al"); break; }
break;
case 'i':
if (ends("iciti")) { r("ic"); break; }
break;
case 'l':
if (ends("ical")) { r("ic"); break; }
if (ends("ful")) { r(""); break; }
break;
case 's':
if (ends("ness")) { r(""); break; }
break;
}
}
/* step5() takes off -ant, -ence etc., in context <c>vcvc<v>. */
private void step5()
{
if (k == 0)
return;
/* for Bug 1 */
switch (b[k - 1])
{
case 'a':
if (ends("al")) break; return;
case 'c':
if (ends("ance")) break;
if (ends("ence")) break; return;
case 'e':
if (ends("er")) break; return;
case 'i':
if (ends("ic")) break; return;
case 'l':
if (ends("able")) break;
if (ends("ible")) break; return;
case 'n':
if (ends("ant")) break;
if (ends("ement")) break;
if (ends("ment")) break;
/* element etc. not stripped before the m */
if (ends("ent")) break; return;
case 'o':
if (ends("ion") && j >= 0 && (b[j] == 's' || b[j] == 't')) break;
/* j >= 0 fixes Bug 2 */
if (ends("ou")) break; return;
/* takes care of -ous */
case 's':
if (ends("ism")) break; return;
case 't':
if (ends("ate")) break;
if (ends("iti")) break; return;
case 'u':
if (ends("ous")) break; return;
case 'v':
if (ends("ive")) break; return;
case 'z':
if (ends("ize")) break; return;
default:
return;
}
if (m() > 1)
k = j;
}
/* step6() removes a final -e if m() > 1. */
private void step6()
{
j = k;
if (b[k] == 'e')
{
int a = m();
if (a > 1 || a == 1 && !cvc(k - 1))
k--;
}
if (b[k] == 'l' && doublec(k) && m() > 1)
k--;
}
/** Stem the word placed into the Stemmer buffer through calls to add().
* Returns true if the stemming process resulted in a word different
* from the input. You can retrieve the result with
* getResultLength()/getResultBuffer() or toString().
*/
public void stem()
{
k = i - 1;
if (k > 1)
{
step1();
step2();
step3();
step4();
step5();
step6();
}
i_end = k + 1;
i = 0;
}
}
/// <summary>Filters {@link StandardTokenizer} with {@link StandardFilter}, {@link
/// LowerCaseFilter}, {@link StopFilter} and {@link SnowballFilter}.
///
/// Available stemmers are listed in {@link SF.Snowball.Ext}. The name of a
/// stemmer is the part of the class name before "Stemmer", e.g., the stemmer in
/// {@link EnglishStemmer} is named "English".
/// </summary>
public class SnowballAnalyzer : Analyzer
{
private System.String name;
private System.Collections.Hashtable stopSet;//停用词表
private string mModelPath; //词性标注软件模型所在位置
/// <summary>Builds the named analyzer with no stop words. </summary>
public SnowballAnalyzer(System.String name)
{
//获得词性标注软件模型所在位置。模型文件一般放在本工程下面
mModelPath = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
mModelPath = new System.Uri(mModelPath).LocalPath + @"\Models\";
this.name = name;
}
/// <summary>Builds the named analyzer with the given stop words. </summary>
public SnowballAnalyzer(System.String name, System.String[] stopWords)
: this(name)
{
stopSet = StopFilter.MakeStopSet(stopWords);
}
/// <summary>Constructs a {@link StandardTokenizer} filtered by a {@link
/// StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}.
/// </summary>
public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
{
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
if (stopSet != null)
result = new StopFilter(result, stopSet);
//从result NokenStream 分离出Token 来,确定词性。
// result = new SnowballFilter(result, name);
return result;
}
/// <summary>
/// 根据Snowball源码自己写的 Analyzer,返回词汇实体列表代替原来调用的TokenStream
///
/// </summary>
/// <param name="fieldName"></param>
/// <param name="reader"></param>
/// <returns></returns>
public List<myEwordEntity> TokenStreamToEntityList(System.String fieldName, System.IO.TextReader reader)
{
TokenStream result = TokenStream(fieldName, reader);
// TokenStream result2 = TokenStream(fieldName, reader);
List<myEwordEntity> wordEnList = new List<myEwordEntity>();
while (true)
{
Token token = result.Next();
myEwordEntity entity = new myEwordEntity();
if (token == null)
break;
else
{
entity.token_begin = token.StartOffset();
entity.token_end = token.EndOffset();
entity.txtWord = token.TermText();//获得词汇文本
entity.stemroot = AfterStemed(entity.txtWord);
wordEnList.Add(entity);
}
}
ArrayList myposlist = new ArrayList();
foreach (myEwordEntity entity in wordEnList)
{
myposlist.Add(entity.txtWord);
}
EnglishMaximumEntropyPosTagger mTager = new EnglishMaximumEntropyPosTagger(mModelPath + "EnglishPOS.nbin", mModelPath + @"\Parser\tagdict");
myposlist = mTager.Tag(myposlist);
for (int i = 0; i < myposlist.Count; i++)
{
wordEnList[i].posWord = myposlist[i].ToString();
}
//对每个词汇进行词根还原
/* result2 = new SnowballFilter(result2, name);
int k=0;//工作下标
while(true)
{
Token token=result2.Next();
if (token == null)
break;
else
{
wordEnList[k].stemroot= token.TermText();
k++;
}
}*/
return wordEnList;
}
public string AfterStemed(string input)
{
Stemmer s = new Stemmer();
input = input.ToLower();
char[] inputchar = input.ToCharArray();
s.add(inputchar, inputchar.Length);
s.stem();
string u = s.stemerToString();
return u;
}
}
}
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using SF.Snowball.Ext;
using System.Collections.Generic;
using System.Collections;
using OpenNLP.Tools.PosTagger;
namespace Lucene.Net.Analysis.Snowball
{
//词汇的实体类,包括两个属性
public class myEwordEntity
{
public string txtWord;//词的文本
public string stemroot;//被过滤后词的词根
public string posWord;//词的词性
public int token_begin;//在文章中的开始位置
public int token_end;//在文章中的结束位置
public myEwordEntity()
{
txtWord = string.Empty;
posWord = string.Empty;
stemroot = string.Empty;
token_begin = 0;
token_end = 0;
}
}
public class Stemmer
{
private char[] b;
private int i, /* offset into b */
i_end, /* offset to end of stemmed word */
j, k;
private static int INC = 50;
/* unit of size whereby b is increased */
public Stemmer()
{
b = new char[INC];
i = 0;
i_end = 0;
}
/**
* Add a character to the word being stemmed. When you are finished
* adding characters, you can call stem(void) to stem the word.
*/
public void add(char ch)
{
if (i == b.Length)
{
char[] new_b = new char[i + INC];
for (int c = 0; c < i; c++)
new_b[c] = b[c];
b = new_b;
}
b[i++] = ch;
}
/** Adds wLen characters to the word being stemmed contained in a portion
* of a char[] array. This is like repeated calls of add(char ch), but
* faster.
*/
public void add(char[] w, int wLen)
{
if (i + wLen >= b.Length)
{
char[] new_b = new char[i + wLen + INC];
for (int c = 0; c < i; c++)
new_b[c] = b[c];
b = new_b;
}
for (int c = 0; c < wLen; c++)
b[i++] = w[c];
}
/**
* After a word has been stemmed, it can be retrieved by toString(),
* or a reference to the internal buffer can be retrieved by getResultBuffer
* and getResultLength (which is generally more efficient.)
*/
public string stemerToString()
{
return new String(b, 0, i_end);
}
/**
* Returns the length of the word resulting from the stemming process.
*/
public int getResultLength()
{
return i_end;
}
/**
* Returns a reference to a character buffer containing the results of
* the stemming process. You also need to consult getResultLength()
* to determine the length of the result.
*/
public char[] getResultBuffer()
{
return b;
}
/* cons(i) is true <=> b[i] is a consonant. */
private bool cons(int i)
{
switch (b[i])
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u': return false;
case 'y': return (i == 0) ? true : !cons(i - 1);
default: return true;
}
}
/* m() measures the number of consonant sequences between 0 and j. if c is
a consonant sequence and v a vowel sequence, and <..> indicates arbitrary
presence,
<c><v> gives 0
<c>vc<v> gives 1
<c>vcvc<v> gives 2
<c>vcvcvc<v> gives 3
....
*/
private int m()
{
int n = 0;
int i = 0;
while (true)
{
if (i > j) return n;
if (!cons(i)) break; i++;
}
i++;
while (true)
{
while (true)
{
if (i > j) return n;
if (cons(i)) break;
i++;
}
i++;
n++;
while (true)
{
if (i > j) return n;
if (!cons(i)) break;
i++;
}
i++;
}
}
/* vowelinstem() is true <=> 0,...j contains a vowel */
private bool vowelinstem()
{
int i;
for (i = 0; i <= j; i++)
if (!cons(i))
return true;
return false;
}
/* doublec(j) is true <=> j,(j-1) contain a double consonant. */
private bool doublec(int j)
{
if (j < 1)
return false;
if (b[j] != b[j - 1])
return false;
return cons(j);
}
/* cvc(i) is true <=> i-2,i-1,i has the form consonant - vowel - consonant
and also if the second c is not w,x or y. this is used when trying to
restore an e at the end of a short word. e.g.
cav(e), lov(e), hop(e), crim(e), but
snow, box, tray.
*/
private bool cvc(int i)
{
if (i < 2 || !cons(i) || cons(i - 1) || !cons(i - 2))
return false;
int ch = b[i];
if (ch == 'w' || ch == 'x' || ch == 'y')
return false;
return true;
}
private bool ends(String s)
{
int l = s.Length;
int o = k - l + 1;
if (o < 0)
return false;
char[] sc = s.ToCharArray();
for (int i = 0; i < l; i++)
if (b[o + i] != sc[i])
return false;
j = k - l;
return true;
}
/* setto(s) sets (j+1),...k to the characters in the string s, readjusting
k. */
private void setto(String s)
{
int l = s.Length;
int o = j + 1;
char[] sc = s.ToCharArray();
for (int i = 0; i < l; i++)
b[o + i] = sc[i];
k = j + l;
}
/* r(s) is used further down. */
private void r(String s)
{
if (m() > 0)
setto(s);
}
/* step1() gets rid of plurals and -ed or -ing. e.g.
caresses -> caress
ponies -> poni
ties -> ti
caress -> caress
cats -> cat
feed -> feed
agreed -> agree
disabled -> disable
matting -> mat
mating -> mate
meeting -> meet
milling -> mill
messing -> mess
meetings -> meet
*/
private void step1()
{
if (b[k] == 's')
{
if (ends("sses"))
k -= 2;
else if (ends("ies"))
setto("i");
else if (b[k - 1] != 's')
k--;
}
if (ends("eed"))
{
if (m() > 0)
k--;
}
else if ((ends("ed") || ends("ing")) && vowelinstem())
{
k = j;
if (ends("at"))
setto("ate");
else if (ends("bl"))
setto("ble");
else if (ends("iz"))
setto("ize");
else if (doublec(k))
{
k--;
int ch = b[k];
if (ch == 'l' || ch == 's' || ch == 'z')
k++;
}
else if (m() == 1 && cvc(k)) setto("e");
}
}
/* step2() turns terminal y to i when there is another vowel in the stem. */
private void step2()
{
if (ends("y") && vowelinstem())
b[k] = 'i';
}
/* step3() maps double suffices to single ones. so -ization ( = -ize plus
-ation) maps to -ize etc. note that the string before the suffix must give
m() > 0. */
private void step3()
{
if (k == 0)
return;
/* For Bug 1 */
switch (b[k - 1])
{
case 'a':
if (ends("ational")) { r("ate"); break; }
if (ends("tional")) { r("tion"); break; }
break;
case 'c':
if (ends("enci")) { r("ence"); break; }
if (ends("anci")) { r("ance"); break; }
break;
case 'e':
if (ends("izer")) { r("ize"); break; }
break;
case 'l':
if (ends("bli")) { r("ble"); break; }
if (ends("alli")) { r("al"); break; }
if (ends("entli")) { r("ent"); break; }
if (ends("eli")) { r("e"); break; }
if (ends("ousli")) { r("ous"); break; }
break;
case 'o':
if (ends("ization")) { r("ize"); break; }
if (ends("ation")) { r("ate"); break; }
if (ends("ator")) { r("ate"); break; }
break;
case 's':
if (ends("alism")) { r("al"); break; }
if (ends("iveness")) { r("ive"); break; }
if (ends("fulness")) { r("ful"); break; }
if (ends("ousness")) { r("ous"); break; }
break;
case 't':
if (ends("aliti")) { r("al"); break; }
if (ends("iviti")) { r("ive"); break; }
if (ends("biliti")) { r("ble"); break; }
break;
case 'g':
if (ends("logi")) { r("log"); break; }
break;
default:
break;
}
}
/* step4() deals with -ic-, -full, -ness etc. similar strategy to step3. */
private void step4()
{
switch (b[k])
{
case 'e':
if (ends("icate")) { r("ic"); break; }
if (ends("ative")) { r(""); break; }
if (ends("alize")) { r("al"); break; }
break;
case 'i':
if (ends("iciti")) { r("ic"); break; }
break;
case 'l':
if (ends("ical")) { r("ic"); break; }
if (ends("ful")) { r(""); break; }
break;
case 's':
if (ends("ness")) { r(""); break; }
break;
}
}
/* step5() takes off -ant, -ence etc., in context <c>vcvc<v>. */
private void step5()
{
if (k == 0)
return;
/* for Bug 1 */
switch (b[k - 1])
{
case 'a':
if (ends("al")) break; return;
case 'c':
if (ends("ance")) break;
if (ends("ence")) break; return;
case 'e':
if (ends("er")) break; return;
case 'i':
if (ends("ic")) break; return;
case 'l':
if (ends("able")) break;
if (ends("ible")) break; return;
case 'n':
if (ends("ant")) break;
if (ends("ement")) break;
if (ends("ment")) break;
/* element etc. not stripped before the m */
if (ends("ent")) break; return;
case 'o':
if (ends("ion") && j >= 0 && (b[j] == 's' || b[j] == 't')) break;
/* j >= 0 fixes Bug 2 */
if (ends("ou")) break; return;
/* takes care of -ous */
case 's':
if (ends("ism")) break; return;
case 't':
if (ends("ate")) break;
if (ends("iti")) break; return;
case 'u':
if (ends("ous")) break; return;
case 'v':
if (ends("ive")) break; return;
case 'z':
if (ends("ize")) break; return;
default:
return;
}
if (m() > 1)
k = j;
}
/* step6() removes a final -e if m() > 1. */
private void step6()
{
j = k;
if (b[k] == 'e')
{
int a = m();
if (a > 1 || a == 1 && !cvc(k - 1))
k--;
}
if (b[k] == 'l' && doublec(k) && m() > 1)
k--;
}
/** Stem the word placed into the Stemmer buffer through calls to add().
* Returns true if the stemming process resulted in a word different
* from the input. You can retrieve the result with
* getResultLength()/getResultBuffer() or toString().
*/
public void stem()
{
k = i - 1;
if (k > 1)
{
step1();
step2();
step3();
step4();
step5();
step6();
}
i_end = k + 1;
i = 0;
}
}
/// <summary>Filters {@link StandardTokenizer} with {@link StandardFilter}, {@link
/// LowerCaseFilter}, {@link StopFilter} and {@link SnowballFilter}.
///
/// Available stemmers are listed in {@link SF.Snowball.Ext}. The name of a
/// stemmer is the part of the class name before "Stemmer", e.g., the stemmer in
/// {@link EnglishStemmer} is named "English".
/// </summary>
public class SnowballAnalyzer : Analyzer
{
private System.String name;
private System.Collections.Hashtable stopSet;//停用词表
private string mModelPath; //词性标注软件模型所在位置
/// <summary>Builds the named analyzer with no stop words. </summary>
public SnowballAnalyzer(System.String name)
{
//获得词性标注软件模型所在位置。模型文件一般放在本工程下面
mModelPath = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
mModelPath = new System.Uri(mModelPath).LocalPath + @"\Models\";
this.name = name;
}
/// <summary>Builds the named analyzer with the given stop words. </summary>
public SnowballAnalyzer(System.String name, System.String[] stopWords)
: this(name)
{
stopSet = StopFilter.MakeStopSet(stopWords);
}
/// <summary>Constructs a {@link StandardTokenizer} filtered by a {@link
/// StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}.
/// </summary>
public override TokenStream TokenStream(System.String fieldName, System.IO.TextReader reader)
{
TokenStream result = new StandardTokenizer(reader);
result = new StandardFilter(result);
result = new LowerCaseFilter(result);
if (stopSet != null)
result = new StopFilter(result, stopSet);
//从result NokenStream 分离出Token 来,确定词性。
// result = new SnowballFilter(result, name);
return result;
}
/// <summary>
/// 根据Snowball源码自己写的 Analyzer,返回词汇实体列表代替原来调用的TokenStream
///
/// </summary>
/// <param name="fieldName"></param>
/// <param name="reader"></param>
/// <returns></returns>
public List<myEwordEntity> TokenStreamToEntityList(System.String fieldName, System.IO.TextReader reader)
{
TokenStream result = TokenStream(fieldName, reader);
// TokenStream result2 = TokenStream(fieldName, reader);
List<myEwordEntity> wordEnList = new List<myEwordEntity>();
while (true)
{
Token token = result.Next();
myEwordEntity entity = new myEwordEntity();
if (token == null)
break;
else
{
entity.token_begin = token.StartOffset();
entity.token_end = token.EndOffset();
entity.txtWord = token.TermText();//获得词汇文本
entity.stemroot = AfterStemed(entity.txtWord);
wordEnList.Add(entity);
}
}
ArrayList myposlist = new ArrayList();
foreach (myEwordEntity entity in wordEnList)
{
myposlist.Add(entity.txtWord);
}
EnglishMaximumEntropyPosTagger mTager = new EnglishMaximumEntropyPosTagger(mModelPath + "EnglishPOS.nbin", mModelPath + @"\Parser\tagdict");
myposlist = mTager.Tag(myposlist);
for (int i = 0; i < myposlist.Count; i++)
{
wordEnList[i].posWord = myposlist[i].ToString();
}
//对每个词汇进行词根还原
/* result2 = new SnowballFilter(result2, name);
int k=0;//工作下标
while(true)
{
Token token=result2.Next();
if (token == null)
break;
else
{
wordEnList[k].stemroot= token.TermText();
k++;
}
}*/
return wordEnList;
}
public string AfterStemed(string input)
{
Stemmer s = new Stemmer();
input = input.ToLower();
char[] inputchar = input.ToCharArray();
s.add(inputchar, inputchar.Length);
s.stem();
string u = s.stemerToString();
return u;
}
}
}
发表评论
-
protocols
2011-04-03 19:22 878<!-- The protocols capabilit ... -
dfcap
2011-04-03 19:15 818<!-- The df capability has a ... -
booktrading /seller
2011-03-29 23:19 865<html><head><tit ... -
booktrading / manager
2011-03-29 23:18 1036<html><head><tit ... -
booktrading / common
2011-03-29 23:17 947<html><head><tit ... -
booktrading / buyer
2011-03-29 23:13 808<!-- <H3>The buyer age ... -
tomcat的context说明书
2011-03-20 17:39 759http://tomcat.apache.org/tomcat ... -
msyql的select语法
2010-09-13 22:52 103213.2.7. SELECT语法 13.2.7.1. ... -
zotero与word集成
2010-09-11 08:50 1685Manually Installing the Zotero ... -
university 2/n
2010-08-24 07:54 834Chapter 1.Introduction of regis ... -
university 1/n
2010-08-24 07:53 882chapter? Introduction ?.?The st ... -
Sun Java Bugs that affect lucene
2010-08-23 08:59 683Sometimes Lucene runs amok of b ... -
penn tree bank 6/6
2010-08-20 07:09 88411 This use of 12 Contact the - ... -
penn tree bank 5/n
2010-08-19 07:40 874always errs on the side of caut ... -
penn tree bank 4/n
2010-08-19 07:39 7844. Bracketing 4.1 Basic Methodo ... -
penn tree bank 3/n
2010-08-15 23:31 7712.3.1 Automated Stage. During t ... -
penn tree bank 2/n
2010-08-15 23:30 1450Mitchell P Marcus et al. Buildi ... -
capabilities 3/3
2010-08-11 22:58 73201<capability xmlns="ht ... -
capabilities 2/3
2010-08-11 22:57 696Fig.3.Element creation cases:a) ... -
capabilities 1/3
2010-08-11 22:56 912Extending the Capability Concep ...
相关推荐
Snowball(English version),滚雪球
可以进行英文词性标注,词根还原,对lucene,snowball源码进行了部分改写
jar包,亲测可用
snowball_py, 面向 python的滚雪球stemming库 面向 python的 Snowball库 Collection这里文档属于 python 版本库发行版的版本,可以从以下位置下载:https://github.com/shibukawa/snowball/这里存储库包含 pyth
迁移数据上云的利器——Amazon Snowball
Snowball是一种小的字符串处理语言,用于创建在信息检索中使用的词干算法,以及使用该词干实现的词干算法的集合。 Snowball最初是由马丁·波特(Martin Porter)设计和建造的。 马丁于2014年从开发中退休,而...
说明Go的Snowball stemmer端口(cgo包装器)。 提供词干提取功能。 有关更多详细信息,请参见http://snowball.tartarus.org/。安装go get github.com/goodsign/snowball go test gith描述Go的Snowball stemmer端口...
NULL 博文链接:https://fanth.iteye.com/blog/846514
基于C#开发的SnowBall Figh塔防游戏源码+游戏录制视频-课程设计.zip基于C#开发的SnowBall Figh塔防游戏源码+游戏录制视频-课程设计.zip基于C#开发的SnowBall Figh塔防游戏源码+游戏录制视频-课程设计.zip基于C#开发...
#Nodejs jSnowball干mm Snowball是一种小的字符串处理语言,旨在创建用于信息检索的词干算法。 Snowball Stemmer的Nodejs版本支持17种语言可以在其主页上找到Snowball提取器。 ##支持的语言-丹麦语-荷兰语-英语-...
自由词Snowball libstemmer 发行版的 Mavenized 版本。 来源取自: : 安装将库安装到本地 Maven 缓存中: git clone http://github.com/abh1nav/libstemmer.gitcd libstemmermvn clean install依靠并将其添加到pom....
雪球:从大型纯文本集合中提取关系这是我自己的Snowball系统的实现,用于引导关系实例。 您可以在此处找到更多详细信息: Eugene Agichtein和Luis Gravano,《 。 在第五届ACM数字图书馆会议论文集中。 ACM,200。 H...
雪球 Snowball是一个WordPress插件,它使任何人都可以为网络创建沉浸式文章。 它是由Drexel大学的开发的。 访问位于的项目页面。 有关我们的动力和方法的更多信息,请查看。
Create React App入门该项目是通过引导的。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误...
Pygments Snowball插件用于 Lexer插件,一种用于的领域特定语言。 请注意,严格来说,该词法分析器是不完整的,因为它假定stringescapes括号为{} 。 实际上,考虑到到目前为止所有正式的Snowball代码都使用{}括号...
python库,解压后可用。 资源全名:Snowball-0.1.1-py3-none-any.whl
资源来自pypi官网。 资源全名:Snowball-0.1.1-py3-none-any.whl
PyStemmer是Snowball项目( )的词干算法的Python接口。 词干提取算法(或词干提取器)是一种从英语单词中删除较常见的词法和形变词结尾的过程。 它的主要用途是术语标准化过程的一部分,该过程通常在设置信息检索...
雪球 您可以在添加此项目的正式托管版本(旋律) 机器人配置 从github版本页面下载二进制文件。 将application.yml文件放在您的工作目录中。...使用java -jar Snowball.jar运行 设置指南在Wiki上。
资源来自pypi官网。 资源全名:mypy-boto3-snowball-1.15.7.0.tar.gz