4

(ちなみに、タイトルが完全なニシンである場合は申し訳ありません)

バックグラウンド:

Twitter Streaming API と ASP.NET SignalR を使用して、世界中のすべてのツイートのマップをリアルタイムで作成しています。Tweetinvi C# Twitter ライブラリを使用して、SignalR を使用してブラウザーにツイートを非同期的にプッシュしています。すべてが期待どおりに機能しています - http://dev.wherelionsroam.co.ukを参照してください。

開発の次のステップでは、スタンフォード自然言語解析ライブラリ ( http://nlp.stanford.edu/software/corenlp.shtml )、特に Named Entity Recognizer (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; }
}

抽象 NamedEntity クラスをオーバーライドするクラスの例である Person クラス:

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
        }
}

Named Entity Recognizer の説明:

NER 認識ライブラリのしくみは、"Luis Suarez" の "PERSON" や "New York" の "PLACE" などのタグを使用して、文章内の単語を分類することです。PERSONこの情報は、NER ライブラリによって単語に割り当てられたタグのタイプ ( 、LOCATION、の選択ORGANISATION)に応じて、NamedEntity クラスのサブクラスに格納されます。

問題:

私の質問は、「Luis Suarez」という用語の複数のバージョンが登場する可能性が高いことを考慮して (つまり、Luis Suarez、Luis Suárez)、どちらも独自の NamedEntity インスタンス (インスタンス内List<NamedEntity>、>親子関係を維持しながら、すべてのツイートから用語「Luis Suarez」の一致するTweetModelインスタンスをグループ化する最良の方法は何でしょうか。これは実質的に逆指数であると知らされましたが、この人物がどれほど十分な情報を持っていたかはわかりません!TweetModelList<NamedEntity>

構造の可視化:

ここに画像の説明を入力

この質問が不明確である場合は、本当に申し訳ありません。これ以上簡潔に表現することはできません。これまでの完全な src については、 https://github.com/adaam2/FinalUniProjectを参照してください。

4

2 に答える 2

1

Person を比較できる場合は、それらを表す一意の名前を見つけることができるはずです。

たとえば、Luis Suarez、luis suarez、Suarez、L. Suárez はすべて「Suarez」に変換されます。この si は 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 の抽象関数である可能性があります。Equals、GethashCode などをオーバーライドする方向で確認することもできます。

通常、各 Person にインデックスがあるマップがあります。この場合、逆ルックアップを実行すると、各インデックスが Person のリストにマップされます。したがって、「反転した」インデックス名です。

于 2014-07-04T10:15:57.073 に答える