[Печь, очищающая ИИ] Машинное обучение 036-НЛП Лексическая редукция

машинное обучение искусственный интеллект Python NLP

[Печь, очищающая ИИ] Машинное обучение 036-НЛП Лексическая редукция

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)

Лемматизация также преобразует слова в их первоначальный вид. В отличие от стемминга, представленного в предыдущей статье, лемматизация намного сложнее. Это более структурированный метод. В примере с сухим извлечением мы видим, что волки извлекаются как волк и т. д., что определенно не то, что мы ожидаем. Итак, здесь мы используем метод лемматизации НЛП для восстановления английских слов.


1. Лемматизация НЛП

Лемматизация основана на словарном отображении, а NLTK также требует ручной аннотации словоформ, иначе восстановление может быть неточным, поэтому в процессе обработки естественного языка текст сначала сегментируется, затем маркируется часть речи, и, наконец, лексический реставрация.

# 待还原的单词
words = ['table', 'probably', 'wolves', 'playing', 'is', 
        'dog', 'the', 'beaches', 'grounded', 'dreamt', 'envision']

# 由于词形还原需要先标注词性,故而此处我们用名词和动词两种词性进行测试
lemmatizers = ['NOUN LEMMATIZER', 'VERB LEMMATIZER'] # 两种词性
lemmatizer = WordNetLemmatizer()
formatted_row = '{:>24}' * (len(lemmatizers) + 1) # 使其打印格式一致
print(formatted_row.format('WORD',*lemmatizers)) # 打印表头

for word in words: # # 每个单词逐一变换
    lemmatized=[lemmatizer.lemmatize(word, pos='n'), lemmatizer.lemmatize(word, pos='v')]
    # 注意里面pos表示词性,分别表示名称和动词
    print(formatted_row.format(word,*lemmatized)) # 对提取后的stem进行拆包

------------------ потерять --------- вывод ------------ ---------- ----------

                WORD         NOUN LEMMATIZER         VERB LEMMATIZER
               table                   table                   table
            probably                probably                probably
              wolves                    wolf                  wolves
             playing                 playing                    play
                  is                      is                      be
                 dog                     dog                     dog
                 the                     the                     the
             beaches                   beach                   beach
            grounded                grounded                  ground
              dreamt                  dreamt                   dream
            envision                envision                envision

------------------------------Заканчивать------------------- ------------------

Видно, что хотя WordNetLemmatizer очень полезен, но нужно заранее судить о части речи, и передать часть речи в качестве параметра в эту функцию, тогда возможно ли автоматически судить о части речи, без нашего надо судить? Это точно, в NLTK есть функция pos_tag, которая умеет автоматически определять часть речи слова, поэтому на основе этого мы можем написать функцию для автоматической обработки всего предложения и вывода формы после восстановления части речи. Следующий код:

# 定义一个函数来对一个句子中的所有单词进行词形还原
def lemmatize_all(sentence):
    wnl = WordNetLemmatizer()
    for word, tag in pos_tag(word_tokenize(sentence)):
        if tag.startswith('NN'):
            yield wnl.lemmatize(word, pos='n')
        elif tag.startswith('VB'):
            yield wnl.lemmatize(word, pos='v')
        elif tag.startswith('JJ'):
            yield wnl.lemmatize(word, pos='a')
        elif tag.startswith('R'):
            yield wnl.lemmatize(word, pos='r')
        else:
            yield word

text ='dog runs, cats drunk wines, chicken eat apples, foxes jumped two meters'
print('/'.join(lemmatize_all(text)))

------------------ потерять --------- вывод ------------ ---------- ----------

dog/run/,/cat/drink/wine/,/chicken/eat/apple/,/fox/jump/two/meter

---------------------------------Заканчивать---------------- ---------------------

Видно, что множественное число существительных в предложении изменено на единственное число, прошедшее время глаголов изменено на настоящее время и т. д.

Что касается функции pos_tag(), она возвращает словесные теги и теги частей речи.

# NLTK 词性标签: 
CC 连词 and, or,but, if, while,although
CD 数词 twenty-four, fourth, 1991,14:24
DT 限定词 the, a, some, most,every, no
EX 存在量词 there, there's
FW 外来词 dolce, ersatz, esprit, quo,maitre
IN 介词连词 on, of,at, with,by,into, under
JJ 形容词 new,good, high, special, big, local
JJR 比较级词语 bleaker braver breezier briefer brighter brisker
JJS 最高级词语 calmest cheapest choicest classiest cleanest clearest
LS 标记 A A. B B. C C. D E F First G H I J K
MD 情态动词 can cannot could couldn't
NN 名词 year,home, costs, time, education
NNS 名词复数 undergraduates scotches
NNP 专有名词 Alison,Africa,April,Washington
NNPS 专有名词复数 Americans Americas Amharas Amityvilles
PDT 前限定词 all both half many
POS 所有格标记 ' 's
PRP 人称代词 hers herself him himself hisself
PRP$ 所有格 her his mine my our ours
RB 副词 occasionally unabatingly maddeningly
RBR 副词比较级 further gloomier grander
RBS 副词最高级 best biggest bluntest earliest
RP 虚词 aboard about across along apart
SYM 符号 % & ' '' ''. ) )
TO 词to to
UH 感叹词 Goodbye Goody Gosh Wow
VB 动词 ask assemble assess
VBD 动词过去式 dipped pleaded swiped
VBG 动词现在分词 telegraphing stirring focusing
VBN 动词过去分词 multihulled dilapidated aerosolized
VBP 动词现在式非第三人称时态 predominate wrap resort sue
VBZ 动词现在式第三人称时态 bases reconstructs marks
WDT Wh限定词 who,which,when,what,where,how
WP WH代词 that what whatever
WP$ WH代词所有格 whose
WRB WH副词

########################резюме########################## ######

1. Лемматизация НЛП может использовать функцию WordNetLemmatizer, но эта функция должна оценивать часть речи слова перед ее использованием, а затем вводить часть речи в качестве параметра в эту функцию для преобразования.

2. Чтобы упростить процесс человеческого суждения, NLTK имеет собственную функцию определения части речи pos_tag, которая может автоматически выводить часть речи слова, поэтому объединение функций pos_tag и WordNetLemmatizer может автоматически выполнять всю текст, сегментация слов, лемматизация и другие операции.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.