Слова в Wor dNet корпус разъяснения - PullRequest
0 голосов
/ 10 марта 2020

Я хочу получить длину слова в WordNet корпусе

Код:

from nltk.corpus import wordnet as wn

len_wn = len([word.lower() for word in wn.words()])
print(len_wn)

Я получаю вывод как 147306

Мои вопросы:

  • Получаю ли я общую длину слов в WordNet?
  • Имеет ли tokens такие, как zoom_in считается word?

1 Ответ

0 голосов
/ 11 марта 2020

Получаю ли я общую длину слов в Wor dNet?

Зависит от того, каково определение слова. Функция wn.words() выполняет итерацию по всем lemma_names, https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1701 и https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L1191

def words(self, lang="eng"):
    """return lemmas of the given language as list of words"""
    return self.all_lemma_names(lang=lang)


def all_lemma_names(self, pos=None, lang="eng"):
    """Return all lemma names for all synsets for the given
    part of speech tag and language or languages. If pos is
    not specified, all synsets for all parts of speech will
    be used."""

    if lang == "eng":
        if pos is None:
            return iter(self._lemma_pos_offset_map)
        else:
            return (
                lemma
                for lemma in self._lemma_pos_offset_map
                if pos in self._lemma_pos_offset_map[lemma]
            )

Так что если определение "слова" имеет вид все возможные леммы, тогда да, эта функция дает вам общую длину слов в именах лемм в Wor dnet:

>>> sum(len(lemma_name) for lemma_name in wn.words())
1692291
>>> sum(len(lemma_name.lower()) for lemma_name in wn.words())
1692291

Строковый регистр не нужен, потому что названия лемм должны были быть уменьшены. Даже именованные сущности, например

>>> 'new_york' in wn.words()
True

Но учтите, что одна и та же лемма может иметь очень похожие названия лемм:

>>> 'new_york' in wn.words()
True
>>> 'new_york_city' in wn.words()
True

Это из-за структуры wor dnet. API в NLTK организует «значение» как синтаксис, который содержит набор ссылок, связанный с несколькими леммами, и каждая лемма имеет как минимум одно имя:

>>> wn.synset('new_york.n.1')
Synset('new_york.n.01')

>>> wn.synset('new_york.n.1').lemmas()
[Lemma('new_york.n.01.New_York'), Lemma('new_york.n.01.New_York_City'), Lemma('new_york.n.01.Greater_New_York')]

>>> wn.synset('new_york.n.1').lemma_names()
['New_York', 'New_York_City', 'Greater_New_York']

Но каждое запрашиваемое «слово» может иметь несколько синтаксисов ( то есть множественное значение), например

>>> wn.synsets('new_york')
[Synset('new_york.n.01'), Synset('new_york.n.02'), Synset('new_york.n.03')]

Значит ли токены, такие как zoom_in, считаться словом?

Зависит от определения слова, как в примере выше, если вы выполняете итерацию по wn.words(), вы перебираете имена лемм, а примеры new_york показывают, что выражения из нескольких слов существуют в списках имен лемм для каждого набора.

...