Я должен использовать конкатенацию своих строковых полей как хэш-код?

Часть речевых токенов

Документы spaCy в настоящее время утверждают:

В тегере части речи используется версия OntoNotes 5 набора тегов Penn Treebank. Мы также сопоставляем теги с более простым набором Google Universal POS Tag.

Точнее, свойство .tag_ предоставляет теги Treebank, а свойство pos_ предоставляет теги на основе Google Universal POS-тегов (хотя spaCy расширяет список).

Документы spaCy, похоже, рекомендуют пользователям, которые просто хотят тупо использовать его результаты, а не обучать свои собственные модели, должны игнорировать атрибут tag_ и использовать только атрибут pos_, заявляя, что tag_ атрибуты ...

в первую очередь предназначены для хороших функций для последующих моделей, в частности синтаксического синтаксического анализатора. Они зависят от языка и древовидного банка.

То есть, если spaCy выпускает улучшенную модель, обученную на новом дереве деревьев , атрибут tag_ может иметь значения, отличные от тех, которые были у него ранее. Это явно делает его бесполезным для пользователей, которым нужен согласованный API при обновлении версий. Однако, поскольку текущие теги являются вариантом Penn Treebank, они, скорее всего, в основном пересекаются с набором, описанным в любой документации POS-тегов Penn Treebank, например: http://web.mit.edu/6.863/www /PennTreebankTags.html

Более полезными тегами pos_ являются

Грубый, менее подробный тег, представляющий класс слов токена

на основе набора универсальных тегов Google POS. Для английского языка список тегов в наборе универсальных тегов POS можно найти здесь, вместе со ссылками на их определения: http://universaldependencies.org/en/pos/index.html

Список выглядит следующим образом:

  • ADJ : прилагательное
  • ADP : сложение
  • ADV : наречие
  • AUX : вспомогательный глагол
  • CONJ : координационное соединение
  • DET : определитель
  • INTJ : междометие
  • NOUN : существительное
  • NUM : цифра
  • PART : частица
  • PRON : местоимение
  • PROPN : собственное существительное
  • PUNCT : пунктуация
  • SCONJ : подчиненное соединение
  • SYM : символ
  • VERB : глагол
  • X : другие [11 129]

Тем не менее, мы можем видеть из модуля частей речи spaCy, что он расширяет эту схему тремя дополнительными константами POS, EOL, NO_TAG и SPACE, которые не является частью набора Universal POS Tag. Из них:

  • Из поиска исходного кода я не думаю, что EOL вообще привыкнет, хотя я не уверен
  • NO_TAG - код ошибки. Если вы попытаетесь разобрать предложение с моделью, которую вы не установили, все Token получат эту POS. Например, у меня не установлена ​​немецкая модель spaCy, и я вижу это на своем локальном компьютере, если пытаюсь ее использовать:

    >>> import spacy
    >>> de_nlp = spacy.load('de')
    >>> document = de_nlp('Ich habe meine Lederhosen verloren')
    >>> document[0]
    Ich
    >>> document[0].pos_
    ''
    >>> document[0].pos
    0
    >>> document[0].pos == spacy.parts_of_speech.NO_TAG
    True
    >>> document[1].pos == spacy.parts_of_speech.NO_TAG
    True
    >>> document[2].pos == spacy.parts_of_speech.NO_TAG
    True
    
  • SPACE используется для любого расстояния помимо единичных нормальных пробелов ASCII (которые не получают свой собственный токен):

    >>> document = en_nlp("This\nsentence\thas      some weird spaces in\n\n\n\n\t\t   it.")
    >>> for token in document:
    ...   print('%r (%s)' % (str(token), token.pos_))
    ... 
    'This' (DET)
    '\n' (SPACE)
    'sentence' (NOUN)
    '\t' (SPACE)
    'has' (VERB)
    '     ' (SPACE)
    'some' (DET)
    'weird' (ADJ)
    'spaces' (NOUN)
    'in' (ADP)
    '\n\n\n\n\t\t   ' (SPACE)
    'it' (PRON)
    '.' (PUNCT)
    

Маркеры зависимостей

Как отмечено в документах, схема тегов зависимости на основе проекта ClearNLP; значения тегов (начиная с версии 3.2.0 ClearNLP, выпущенной в 2015 году, которая остается последней версией и, по-видимому, используется spaCy) можно найти по адресу https://github.com/clir/clearnlp Руководящие указания / блоб / ведущий / мД / характеристики / dependency_labels.md . В этом документе перечислены следующие токены:

  • ACL: модификатор Clausal существительного
  • ACOMP: дополнительное прилагательное
  • ADVCL: модификатор условного выражения
  • ADVMOD: Модификатор наречий
  • AGENT: Агент
  • AMOD: Модификатор прилагательного
  • APPOS: Модификатор аппозиции
  • ATTR: Атрибут
  • AUX: вспомогательный
  • AUXPASS: вспомогательный (пассивный)
  • CASE: маркер регистра
  • CC: координационное соединение
  • CCOMP: дополнение Клауса
  • COMPOUND: модификатор соединения
  • CONJ: соединение
  • CSUBJ: субъект Клауса
  • CSUBJPASS: субъект (пассивный)
  • DATIVE: дательный падеж
  • DEP: неклассифицированный зависимый
  • DET: определитель
  • DOBJ: прямой объект
  • EXPL: исключительный
  • INTJ: междометие
  • MARK: маркер
  • META: мета-модификатор
  • NEG: модификатор отрицания
  • NOUNMOD: модификатор именного
  • NPMOD: существительная фраза как модификатор наречий
  • NSUBJ: Номинальный предмет
  • NSUBJPASS: Номинальный с ubject (пассивный)
  • NUMMOD: модификатор числа
  • OPRD: предикат объекта
  • PARATAXIS: паратаксис
  • PCOMP: дополнить предлога
  • POBJ: объект предлога
  • POSS: модификатор владения
  • PRECONJ: прекорреляционное соединение
  • PREDET : Предопределитель
  • PREP: модификатор предложения
  • PRT: частица
  • PUNCT: пунктуация
  • QUANTMOD: модификатор квантификатор
  • RELCL: модификатор относительного предложения
  • ROOT: корень
  • XCOMP: дополнение дополнения Клауса

Связанный ClearNLP Документация также содержит краткое описание того, что означает каждый из приведенных выше терминов.

В дополнение к вышеприведенной документации, если вы хотите увидеть примеров этих зависимостей в реальных предложениях, вас может заинтересовать работа Джинхо Д. Чоя 2012 года: либо его ] Оптимизация компонентов обработки естественного языка для надежности и масштабируемости или его руководящих принципов для преобразования стилей CLEAR в преобразование зависимостей (которое, кажется, просто подраздел бывшей статьи). Оба перечисляют все метки зависимостей CLEAR, которые существовали в 2012 году, вместе с определениями и примерами предложений. (К сожалению, набор меток зависимостей CLEAR немного изменился с 2012 года, поэтому некоторые из современных меток не перечислены или не приведены в качестве примера в работе Чоя - но он остается полезным ресурсом, хотя и немного устаревшим.)

14
задан cdmckay 5 June 2009 в 19:09
поделиться

3 ответа

Я бы избегал этого просто на том основании, что это бессмысленно создает кучу строк - хотя точка Kosi2801 о упрощении коллизий также актуальна. (Я подозреваю, что на самом деле не вызовет много столкновений из-за природы полей, но ...)

Я бы выбрал алгоритм «простой и легкий, чтобы получить правильный» I ' Ранее использовался в этом ответе (спасибо, что искал его, lance :) - и, как вы сказали, он указан в Эффективной Java. В этом случае это будет выглядеть так:

public int GetHashCode()
{
    int hash = 17;
    // Suitable nullity checks etc, of course :)
    hash = hash * 23 + StreetAddress.GetHashCode();
    hash = hash * 23 + RuralRoute.GetHashCode();
    hash = hash * 23 + City.GetHashCode();
    hash = hash * 23 + Province.GetHashCode();
    hash = hash * 23 + Country.GetHashCode();
    hash = hash * 23 + PostalCode.GetHashCode();
    return hash;
}

Конечно, это не нулевое значение. Если вы используете C # 3, вы можете рассмотреть метод расширения:

public static int GetNullSafeHashCode<T>(this T value) where T : class
{
    return value == null ? 1 : value.GetHashCode();
}

Затем вы можете использовать:

public int GetHashCode()
{
    int hash = 17;
    // Suitable nullity checks etc, of course :)
    hash = hash * 23 + StreetAddress.GetNullSafeHashCode();
    hash = hash * 23 + RuralRoute.GetNullSafeHashCode();
    hash = hash * 23 + City.GetNullSafeHashCode();
    hash = hash * 23 + Province.GetNullSafeHashCode();
    hash = hash * 23 + Country.GetNullSafeHashCode();
    hash = hash * 23 + PostalCode.GetNullSafeHashCode();
    return hash;
}

Вы можете создать утилиту метода массива параметров, чтобы сделать это еще проще:

public static int GetHashCode(params object[] values)
{
    int hash = 17;
    foreach (object value in values)
    {
        hash = hash * 23 + value.GetNullSafeHashCode();
    }
    return hash;
}

и назовите его:

public int GetHashCode()
{
    return HashHelpers.GetHashCode(StreetAddress, RuralRoute, City,
                                   Province, Country, PostalCode);
}

В большинстве типов задействованы примитивы, так что упаковка будет выполняться без надобности, но в этом случае у вас будут только ссылки. Конечно, вы закончите создание массива без надобности, но вы знаете, что говорят о преждевременной оптимизации ...

15
ответ дан 1 December 2019 в 13:59
поделиться

Не делайте этого, потому что объекты могут быть разными, хотя хэш-код один и тот же.

Подумайте о

"StreetAddress" + "RuralRoute" + "City"

vs

"Street" + "AddressRural" + "RouteCity"

Оба будут имеют одинаковый хэш-код, но разное содержание в полях.

5
ответ дан 1 December 2019 в 13:59
поделиться

Для такого рода вещей вы можете реализовать IEqualityComparer

: ​​

public class Address : IEqualityComparer<Address>
{        
    //
    // member declarations
    //

    bool IEqualityComparer<Address>.Equals(Address x, Address y)
    {
        // implementation here
    }

    int IEqualityComparer<Address>.GetHashCode(Item obj)
    {
        // implementation here
    }
}

Вы также можете реализовать IComparable

для получить заказ ...

0
ответ дан 1 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: