(对不起,如果标题是一个完整的红鲱鱼顺便说一句)
背景:
我正在使用Twitter Streaming API和ASP.NET SignalR实时开发世界上所有推文的地图.我正在使用Tweetinvi C#Twitter库使用SignalR将推文异步推送到浏览器.一切都按预期工作 – 请参阅http://dev.wherelionsroam.co.uk以了解它.
开发的下一步是使用斯坦福自然语言分析库(http://nlp.stanford.edu/software/corenlp.shtml)解析每个推文的文本数据,特别是命名实体识别器(也称为CRFC分类器),以便我可以从每条推文中提取有意义的元数据(即人物,地点)和组织提到).期望的结果是,我将能够确定许多人正在谈论的人物,地点和组织(类似于“趋势”概念),并使用SignalR将它们广播给所有客户.我知道Twitter API有GET趋势方法,但这不会有任何乐趣吗?!
以下是我的应用中的主要类:
主要课程:
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>();
}
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库将哪个类型的标记归因于该单词(选择PERSON,LOCATION,ORGANIZATION)
问题:
我的问题是,考虑到可能会出现多个版本的术语“Luis Suarez”(即Luis Suarez,LuisSuárez),这两个版本都将在他们自己独特的NamedEntity实例中定义(在List< NamedEntity>中) ;实例,反过来在TweetModel实例内部),将所有推文中的术语“Luis Suarez”的匹配实例分组在一起的最佳方式是什么,同时仍然保留TweetModel>列表与LT; NamedEntity>亲子关系.我被告知这实际上是一个倒置指数,但我不确定这个人有多了解!
结构可视化:
如果这个问题不清楚,我真的很抱歉;我不能用比这更简洁的方式来表达它!有关完整的src,请参阅https://github.com/adaam2/FinalUniProject
最佳答案 1-添加列表< 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);
基本上唯一困难的部分是让生成命名实体的函数在不同的推文上找到文本’Luis Suarez’和’LuisSuárez’时返回相同的对象.