(抱歉,标题是完整的红色鲱鱼)

背景:

我正在使用Twitter Streaming API和ASP.NET SignalR实时绘制世界上所有推文的 map 。我正在使用Tweetinvi C#Twitter库通过SignalR将推文异步推送到浏览器。一切都按预期工作-请参阅http://dev.wherelionsroam.co.uk了解它。

开发的下一步涉及使用斯坦福自然语言解析库(http://nlp.stanford.edu/software/corenlp.shtml),特别是命名实体识别器(也称为CRFClassifier)来解析每个推文的文本数据,以便我可以从每个推文中提取有意义的元数据(即People,Places和提到的组织)。理想的结果是,我将能够确定很多人正在谈论的人员,地点和组织(类似于“趋势”的概念),并使用SignalR将其广播给所有客户端。我知道Twitter API具有GET trends方法,但这不会很有趣吗?

这是我的应用程序中的主要类:

主要类(class):

TweetModel.cs(保存与从流API广播的有关一条推文的所有信息):

public class TweetModel
{
    public string User { get; set; }
    public string Text { get; set; }
    public DateTime CreatedAt { get; set; }
    public string ImageUrl { get; set; }
    public double Longitude { get; set; }
    public double Latitude { get; set; }
    public string ProfileUrl { get; set; }

    // This field is set later during Tokenization / Named Entity Recognition
    public List<NamedEntity> entities = new List<NamedEntity>();
}

Abstract NamedEntity类:
public abstract class NamedEntity
{
    /// <summary>
    /// Abstract modelling class for NER tagging - overridden by specific named entities. Used here so that all classes inherit from a single base class - polymorphic list
    /// </summary>
    protected string _name;
    public abstract string Name { get; set; }
}

Person类,它是覆盖抽象NamedEntity类的类的示例:
public class Person : NamedEntity
{
    public override string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
    public string entityType = "Person";
}

TweetParser类:
 public class TweetParser
    {
        // Static List to hold all of tweets (and their entities) - tweets older than 20 minutes are cleared out
        public static List<TweetModel> tweets = new List<TweetModel>();
        public TweetParser(TweetModel tweet)
        {
            ProcessTweet(tweet);
            // Removed all of NER logic from this class
        }
}

命名实体识别器的说明:

NER识别库的工作方式是使用标记将句子中的单词分类,例如“Luis Suarez”的“PERSON”或“New York”的“PLACE”。此信息存储在NamedEntity类的子类中,具体取决于NER库为单词赋予的标签类型(PERSONLOCATIONORGANISATION的选择)

问题:

我的问题是,考虑到可能会出现“路易斯·苏亚雷斯”一词的多个版本(即路易斯·苏亚雷斯,路易斯·苏亚雷斯),这两个版本都将在各自独立的NamedEntity实例(在List<NamedEntity>实例内部,依次在TweetModel实例内部),这是将所有“推文”中匹配术语“Luis Suarez”的匹配实例组合在一起的最佳方法,同时仍保留TweetModel> List<NamedEntity>父子关系。我被告知这实际上是一个倒排索引,但是我不确定此人的信息水平!

结构的可视化:

如果这个问题不清楚,我真的很抱歉;简而言之,我简直无法表达!到目前为止的完整src,请参阅https://github.com/adaam2/FinalUniProject

最佳答案

1-将List<TweetModel>属性添加到NamedEntity中。

public abstract List<TweetModel> Tweets { get; set; }

2-保证您的Tokenization函数始终为同一标签返回相同的NamedEntity对象。

3-当您将NamedEntity添加到实体列表时,还要将TweetModel添加到NamedEntity的列表中。
Person p = this is the result of the Tokenization;
entities.Add(p);
p.Tweets.Add(this);

基本上,唯一困难的部分是让生成命名实体的函数在不同的Tweet上找到文本“Luis Suarez”和“LuisSuárez”时返回相同的对象。

09-11 19:47