2014-07-04 123 views
4

(很抱歉,如果標題是順便一完整的紅鯡魚)反向索引

背景:

我開發地圖所有的鳴叫的在世界上真正的使用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(包含所有的關於鳴叫廣播將其從流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識別庫工作的方式是將句子中的單詞用「PERSON」作爲「Luis Suarez」或「PLACE」作爲「紐約」的標籤進行分類。此信息存儲在子類中NamedEntity類的,這取決於由NER庫已被歸因於這個詞是什麼類型的標籤(選擇PERSONLOCATIONORGANISATION

問題:

我的問題是,考慮到可能有多個版本的「路易斯蘇亞雷斯」(即路易斯蘇亞雷斯,路易斯蘇亞雷斯),這兩個版本都將在他們自己的不同NamedEntity實例中定義(在List<NamedEntity>實例中,然後在TweetModel實例中),將術語「Luis Suarez」的匹配實例分組的最佳方式是什麼呃來自所有推文,同時仍然保留親子關係TweetModel>List<NamedEntity>。我被告知這實際上是一個倒排索引,但我不確定這個人有多瞭解!

可視化結構:

enter image description here

我真的很抱歉,如果這個問題還不清楚;我不能用比這更簡潔的表達來表達它!至於完整的src到目前爲止,請參閱https://github.com/adaam2/FinalUniProject

+0

所以你想要一個結構,其中Tweets包含名稱,同時一個名稱包含Tweets?這聽起來像是一個倒排索引。然後,你對字符串的模糊比較是第二個要求,第一個要求會讓第一個要求複雜化。 –

+0

@NathanCooper實際上是的。就模糊字符串匹配而言,我使用了一個模糊匹配庫,它返回Levenshtein距離(返回double類型的值),以確定字符串需要與另一個字符串相同的編輯次數。我認爲編輯次數的任意最大值爲1或2次編輯 – adaam

+0

您想要的是多對多關係,其中TweetModel具有許多NamedEntities,而NamedEntity存在於Many TweetModels中。 –

回答

1

1-將List<TweetModel>財產添加到您的NamedEntity

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

2-保證你的符號化功能始終返回相同標記的相同NamedEntity對象。

3-當您將NamedEntity添加到實體列表時,還會將TweetModel添加到NamedEntity的列表中。

Person p = this is the result of the Tokenization; 
entities.Add(p); 
p.Tweets.Add(this); 

基本上唯一的困難的部分是有一個生成所述命名實體返回相同的對象時,發現在不同的鳴叫文本「蘇亞雷斯」和「蘇亞雷斯」的功能。

+0

我明白了!對,當我下班回家看看它是否有效時,我將不得不試試這個! – adaam

+0

這很好用!快速的問題..肯定TweetModel>命名實體> TweetModel等關係會遞減無限還是我誤解? – adaam

+0

@adaam是的,它將是無限的,但你只能迭代一個,但手動用戶可以無限期地從一個到另一個。 –

1

如果你能比較人,那麼你應該能夠找到一個唯一的名稱來表示他們。

舉例而言,所有路易斯·蘇亞雷斯,蘇亞雷斯,蘇亞雷斯,蘇亞雷斯L.全部翻譯成「蘇亞雷斯」 這對通過MyHashFunctionForPerson

然後使用哈希表:

Dictionary<string,List<Person>> map = new Dictionary<string,List<Person>>(); 

List<Person> FindMatches(Person p) 
{ 
    string h = MyHashFunctionForPerson(p); 
    if (!map.ContainsKey(h)) 
    map[h] = new List<person(); 
    map[h].add(p); 
    return map[h]; 
} 

MyHashFunction可能是NamedEntity的抽象函數。 你也可以檢查方向覆蓋等於,GethashCode等

通常你有一個地圖,每個人有一個索引。 在這種情況下,您可以進行反向查找,每個索引映射到Person列表。因此,「倒置」的索引名稱。