Вход: «Моя любимая игра - это зов долга».

И я поставил в качестве ключевых слов «зов долга», эта фраза будет одним словом в процессе токенизации.

Наконец, хочу получить результат: ['my', 'favourite', 'game', 'is', 'call of duty']

Итак, как установить ключевые слова в python NLP?

1
blackbaka 24 Апр 2017 в 14:06

2 ответа

Лучший ответ

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

import nltk
from nltk import pos_tag
from nltk import tokenize

def extract_phrases(my_tree, phrase):
   my_phrases = []
   if my_tree.label() == phrase:
       my_phrases.append(my_tree.copy(True))

   for child in my_tree:
       if type(child) is nltk.Tree:
           list_of_phrases = extract_phrases(child, phrase)
           if len(list_of_phrases) > 0:
               my_phrases.extend(list_of_phrases)

   return my_phrases


def main():
    sentences = ["My favorite game is call of duty"]

    grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"
    cp = nltk.RegexpParser(grammar)

    for x in sentences:
        sentence = pos_tag(tokenize.word_tokenize(x))
        tree = cp.parse(sentence)
        print "\nNoun phrases:"
        list_of_noun_phrases = extract_phrases(tree, 'NP')
        for phrase in list_of_noun_phrases:
            print phrase, "_".join([x[0] for x in phrase.leaves()])

if __name__ == "__main__":
    main()

Это выведет следующее:

Noun phrases:
(NP favorite/JJ game/NN) favorite_game
(NP call/NN) call
(NP duty/NN) duty

Но вы можете поиграть с

grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"

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

Также, если вам интересно, проверьте это очень хорошее введение в извлечение ключевой фразы / слова:

https://bdewilde.github.io/blog/2014/09/23/intro-to-automatic-keyphrase-extraction/

3
David Batista 25 Апр 2017 в 12:27

Это, конечно, слишком поздно, чтобы быть полезным для ОП, но я подумал, что выложу этот ответ здесь для других:

Похоже, вы действительно спрашиваете: как мне сделать так, чтобы составные фразы, такие как «обязанность», были сгруппированы в один токен?

Вы можете использовать токенайзер выражений из нескольких слов nltk, например:

string = 'My favorite game is call of duty'
tokenized_string = nltk.word_tokenize(string)

mwe = [('call', 'of', 'duty')]
mwe_tokenizer = nltk.tokenize.MWETokenizer(mwe)
tokenized_string = mwe_tokenizer.tokenize(tokenized_string)

Где mwe обозначает выражение из нескольких слов. Значение tokenized_string будет ['My', 'favorite', 'game', 'is', 'call of duty']

1
Aj Langley 7 Окт 2017 в 03:27