在C#中使用POS Tagger Stanford NLP的每个句子的词性标签列表

时间:2015-04-19 10:00:59

标签: c# stanford-nlp pos-tagger

使用Standford NPL .NET的POS Tagger,我试图提取每个句子的部分词性标签的详细列表。

  

例如:"看看那边。看看车!"

     

/ / a / DT看/ NN over / IN / RB ./。在/ DT车/ NN的/ IN处查看/ VB   !/

我需要:

  • POS文字:"有"
  • POS标签:" VB"
  • 原始文字中的位置

我设法通过反射访问结果的私有字段来实现这一目标。

我知道它很丑陋,不高效而且非常糟糕,但这是我发现的唯一知识。因此,我的问题;是否有任何内置的方式来访问这些信息?

using (var streamReader = new StringReader(rawText))
{
    var tokenizedSentences = MaxentTagger.tokenizeText(streamReader).toArray();

    foreach (ArrayList tokenizedSentence in tokenizedSentences)
    {
        var taggedSentence = _posTagger.tagSentence(tokenizedSentence).toArray();

        for (int index = 0; index < taggedSentence.Length; index++)
        {
            var partOfSpeech = ((StringLabel) (taggedSentence[index]));
            var posText = partOfSpeech.value();

            var posTag = ReflectionHelper.GetInstanceField(typeof (TaggedWord), partOfSpeech, "tag") as string;
            var posBeginPosition = (int)ReflectionHelper.GetInstanceField(typeof (StringLabel), partOfSpeech, "beginPosition");
            var posEndPosition = (int)ReflectionHelper.GetInstanceField(typeof (StringLabel), partOfSpeech, "endPosition");

            // process the pos

        }


    } 

ReflectionHelper:

public static object GetInstanceField<T>(T instance, string fieldName)
        {
            const BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;

            object result = null;
            var field = typeof(T).GetField(fieldName, bindFlags);
            if (field != null)
            {
                result = field.GetValue(instance);
            }
            return result;
        }

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。 只需将词性(taggedSentence [index])转换为TaggedWord即可。 然后,您可以从getter beginPosition(),endPosition(),tag()和value()轻松访问这些属性。