Как передать более одного тега при лемматизировании с использованием текстового блоба - PullRequest
1 голос
/ 17 апреля 2020

Я хочу передать более одного параметра для выполнения лемматизации, например 'глагол', 'нет', используя textblob

вот мой код, который я взял отсюда: https://www.machinelearningplus.com/nlp/lemmatization-examples-python/

Мой вопрос заключается в том, как я могу изменить свой код, чтобы передать как 'глагол', так и 'none' функции

def lemm_text(text):
    text = str(text)
    sent = TextBlob(text)
    tag_dict = {"J": 'a', 
                "N": 'n', 
                "V": 'v', 
                "R": 'r'}
    words_and_tags = [(w, tag_dict.get(pos[0], 'n')) for w, pos in sent.tags]    
    lemmatized_list = [wd.lemmatize(tag) for wd, tag in words_and_tags]
    return " ".join(lemmatized_list)

data_words_nostops = map(lemm_text, data_words_nostops)
list(data_words_nostops)

Я пытался передать или кортеж, но это не сработало, и Я получил ниже ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-35-1fd4bee599c2> in <module>
----> 1 list(data_words_nostops)

<ipython-input-30-062f187cdad0> in lemm_text(text)
      7                 "R": 'r'}
      8     words_and_tags = [(w, tag_dict.get(pos[0], ['n','v'])) for w, pos in sent.tags]
----> 9     lemmatized_list = [wd.lemmatize(tag) for wd, tag in words_and_tags]
     10     return " ".join(lemmatized_list)

<ipython-input-30-062f187cdad0> in <listcomp>(.0)
      7                 "R": 'r'}
      8     words_and_tags = [(w, tag_dict.get(pos[0], ['n','v'])) for w, pos in sent.tags]
----> 9     lemmatized_list = [wd.lemmatize(tag) for wd, tag in words_and_tags]
     10     return " ".join(lemmatized_list)

C:\ProgramData\Anaconda3\lib\site-packages\textblob\decorators.py in decorated(*args, **kwargs)
     33     def decorated(*args, **kwargs):
     34         try:
---> 35             return func(*args, **kwargs)
     36         except LookupError as err:
     37             print(err)

C:\ProgramData\Anaconda3\lib\site-packages\textblob\blob.py in lemmatize(self, pos)
    145         if pos is None:
    146             tag = _wordnet.NOUN
--> 147         elif pos in _wordnet._FILEMAP.keys():
    148             tag = pos
    149         else:

TypeError: unhashable type: 'list'

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете сделать это, если вам нужны только глаголы и существительные:

def lemmatize_with_postag(text): 
    sent = TextBlob(text) 
    tag_dict = {"N": 'n',  
                "V": 'v',} 
    words_and_tags = [(w, tag_dict.get(pos[0], 'n')) for w, pos in sent.tags 
                      if pos[0] in ('N','V')]     
    lemmatized_list = [wd.lemmatize(tag) for wd, tag in words_and_tags] 
    return " ".join(lemmatized_list) 

Как это работает:

In [40]: sentence = "The striped bats are hanging on their feet for best"

In [41]: lemmatize_with_postag(sentence)                           
Out[41]: 'bat be hang foot'
...