НЛП: Как я могу сочетать в себе основы и пометки? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь написать код, который передает текст, который был разбит на токены и отфильтрован стоп-слова, а затем связан и помечен как тег. Тем не менее, я не уверен, в каком порядке я должен использовать теги. Вот что у меня на данный момент:

#### Stemming
ps = PorterStemmer()    # PorterStemmer imported from nltk.stem

stemText = []

for word in swFiltText:    # Tagged text w/o stop words
    stemText.append(ps.stem(word))


#### POS Tagging
def tagging():
    tagTot = []
    try:
        for i in stemText:
            words = nltk.word_tokenize(i)    # I need to tokenize again (idk why?)
            tagged = nltk.pos_tag(words)
            tagTot = tagTot + tagged    # Combine tagged words into list

    except Exception as e:
        print(str(e))
    return tagTot

tagText = tagging()

На первый взгляд это работает просто отлично. Однако, поскольку я остановился первым, pos_tag часто неправильно маркирует слова. Например, он помечал «hous» как прилагательное, когда оригинальное слово действительно было существительным «house». Но когда я пытаюсь остановить после тегирования, это дает мне ошибку о том, что pos_tag не может справиться с 'кортежами' - я предполагаю, что это как-то связано с тем, как стеммер форматирует список слов как [('come', 'VB'), ('hous', 'JJ'), et c.

Должен ли я использовать другой стеммер / tagger? Или ошибка в моем коде?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вы должны пометить текст до того, как вы примените к нему основание или лемматизацию.

Удаление окончаний слов отнимает важные подсказки о том, какой тэг части слова может быть словом .

Причиной, по которой вы получили hous в качестве прилагательного, является то, что любой теггер ожидает необработанные токены, а слова, заканчивающиеся на -ous в английском языке sh, обычно являются прилагательными. ( гнусный , серьезный ). Если вы сначала отметите его, он может быть распознан (даже без контекста) как существительное или глагол. Затем тэггер может использовать контекст (которому предшествует ? -> существительное) для устранения неоднозначности, что является наиболее вероятным.

Хороший лемматизатор может принять во внимание часть речи, Например, корпус может быть существительным (лемма: корпус ) или глаголом (лемма: дом ). С помощью pos-информации лемматизатор может сделать правильный выбор там.

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

  1. Стебминг происходит намного быстрее, поскольку у стеммеров есть несколько правил обработки различных концовок
  2. Лемматизация дает вам «правильные» слова, которые вы можете искать в словарях (если вы хотите получить глоссы на других языках или в определениях)
  3. Стволовые строки иногда не похожи на оригинальное слово, и если вы представите их пользователю-человеку, они могут получить confused
  4. Stemmers объединяют слова, которые имеют сходные значения, но разные леммы, поэтому для поиска информации они могут быть более полезными
  5. Stemmers не нужен список слов, так что если вы хотите написать свой собственный stemmer, это быстрее, чем писать лемматизатор (если вы обрабатываете языки, для которых не существует готовых инструментов)
0 голосов
/ 24 апреля 2020

Я бы посоветовал использовать лемматизацию над основанием, так как оно просто отрубает буквы с конца до тех пор, пока не будет достигнуто слово «корень / основа». Лемматизация также смотрит на окружающий текст, чтобы определить часть речи данного слова.

...