(对不起,如果标题是一个完整的红鲱鱼顺便说一句)
背景:
我正在使用 Twitter Streaming API 和 ASP.NET SignalR 实时开发世界上所有推文的地图。我正在使用 Tweetinvi C# Twitter 库使用 SignalR 将推文异步推送到浏览器。一切都按预期工作 - 请参阅http://dev.wherelionsroam.co.uk了解它。
开发的下一步涉及使用斯坦福自然语言解析库 ( http://nlp.stanford.edu/software/corenlp.shtml ) 解析每条推文的文本数据,特别是命名实体识别器(也称为 CRFClassifier),因此我可以从每条推文中提取有意义的元数据(即提到的人物、地点和组织)。期望的结果是我将能够确定很多人正在谈论的人员、地点和组织(类似于“趋势”的概念),并使用 SignalR 将它们广播给所有客户。我知道 Twitter API 有这些GET trends
方法,但这不会很有趣吗?!
以下是我的应用程序中的主要类:
主要课程:
TweetModel.cs(保存有关推文的所有信息,作为从 Streaming 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>();
}
抽象 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 库赋予单词的标签类型(选择PERSON
, LOCATION
, ORGANISATION
)
问题:
我的问题是,考虑到可能有多个版本的术语“Luis Suarez”出现(即 Luis Suarez、Luis Suárez),它们都将在各自不同的 NamedEntity 实例中定义(在实例内部List<NamedEntity>
,在在TweetModel
实例内部),将所有推文中“Luis Suarez”一词的匹配实例分组在一起,同时仍然保留TweetModel
>List<NamedEntity>
父子关系的最佳方法是什么。我被告知这实际上是一个倒排索引,但我不确定这个人有多了解情况!
结构可视化:
如果这个问题不清楚,我真的很抱歉;我真的无法用比这更简洁的方式表达它!到目前为止的完整 src,请参阅https://github.com/adaam2/FinalUniProject