Стемминг и лемматизация на массиве - PullRequest
0 голосов
/ 19 сентября 2019

Я не совсем понимаю, почему я не могу лемматизировать или делать Стемминг.Я пытался преобразовать массив в строку, но мне не повезло.

Это мой код.

import bs4, re, string, nltk, numpy as np, pandas as pd
from nltk.stem import PorterStemmer
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen

news_url="https://news.google.com/news/rss"
Client=urlopen(news_url)
xml_page=Client.read()
Client.close()

soup_pg=soup(xml_page,"xml")
news_lst=soup_page.findAll("item")
limit=19
corpus = []
# Print news title, url and publish date
for index, news in enumerate(news_list):
        #print(news.title.text)
        #print(index+1)
        corpus.append(news.title.text)
        if index ==limit:
            break
#print(arrayList)
df = pd.DataFrame(corpus, columns=['News'])

wpt=nltk.WordPunctTokenizer()
stop_words=nltk.corpus.stopwords.words('english')
def normalize_document (doc):
    #lowercase and remove special characters\whitespace
    doc=re.sub(r'[^a-zA-Z\s]', '', doc, re.I|re.A) #re.I ignore case sensitive, ASCII-only matching
    doc=doc.lower()
    doc=doc.strip()
    #tokenize document
    tokens=wpt.tokenize(doc)
    #filter stopwords out of document
    filtered_tokens=[token for token in tokens if token not in stop_words]
    #re-create documenr from filtered tokens
    doc=' '.join(filtered_tokens)
    return doc

normalize_corpus=np.vectorize(normalize_document)
norm_corpus=normalize_corpus(corpus)
norm_corpus

Полученная ошибка начинается со следующих строк, которые я добавляю

stemmer = PorterStemmer()
sentences = nltk.sent_tokenize(norm_corpus)
# Stemming
for i in range(len(norm_corpus)):
    words = nltk.word_tokenize(norm_corpus[i])
    words = [stemmer.stem(word) for word in words]
    norm_corpus[i] = ' '.join(words)

как только я вставляю эти строки, я получаю следующую ошибку: TypeError: не могу использовать строковый шаблон на байтовоподобном объекте

Я думаю, что если я решу ошибку с помощью stemming, это будет тем же решениемна мою ошибку с лемматизацией.

1 Ответ

0 голосов
/ 19 сентября 2019

Тип norm_corpus равен numpy.ndarray, т.е. байты.Метод sent_tokenize ожидает string, следовательно, ошибка.Вам нужно преобразовать norm_corpus в список строк, чтобы избавиться от этой ошибки.

Чего я не понимаю, так это зачем вам векторизовывать документ перед тем, как использовать его?Есть ли проблема в том, чтобы сделать это иначе, то есть сначала остановить, а затем векторизовать.Ошибка должна быть устранена тогда

...