Документы 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 года, поэтому некоторые из современных меток не перечислены или не приведены в качестве примера в работе Чоя - но он остается полезным ресурсом, хотя и немного устаревшим.)
Я бы избегал этого просто на том основании, что это бессмысленно создает кучу строк - хотя точка 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);
}
В большинстве типов задействованы примитивы, так что упаковка будет выполняться без надобности, но в этом случае у вас будут только ссылки. Конечно, вы закончите создание массива без надобности, но вы знаете, что говорят о преждевременной оптимизации ...
Не делайте этого, потому что объекты могут быть разными, хотя хэш-код один и тот же.
Подумайте о
"StreetAddress" + "RuralRoute" + "City"
vs
"Street" + "AddressRural" + "RouteCity"
Оба будут имеют одинаковый хэш-код, но разное содержание в полях.
Для такого рода вещей вы можете реализовать 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
для получить заказ ...