(抱歉,标题是完整的红色鲱鱼)
背景:
我正在使用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库为单词赋予的标签类型(
PERSON
,LOCATION
,ORGANISATION
的选择)问题:
我的问题是,考虑到可能会出现“路易斯·苏亚雷斯”一词的多个版本(即路易斯·苏亚雷斯,路易斯·苏亚雷斯),这两个版本都将在各自独立的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”时返回相同的对象。