我正在尝试使用lemmatizer
预处理字符串,然后删除标点符号和数字。我正在使用下面的代码来做到这一点。我没有收到任何错误,但是文本没有经过适当的预处理。仅除去停用词,但去词法不起作用,标点符号和数字也保留下来。
from nltk.stem import WordNetLemmatizer
import string
import nltk
tweets = "This is a beautiful day16~. I am; working on an exercise45.^^^45 text34."
lemmatizer = WordNetLemmatizer()
tweets = lemmatizer.lemmatize(tweets)
data=[]
stop_words = set(nltk.corpus.stopwords.words('english'))
words = nltk.word_tokenize(tweets)
words = [i for i in words if i not in stop_words]
data.append(' '.join(words))
corpus = " ".join(str(x) for x in data)
p = string.punctuation
d = string.digits
table = str.maketrans(p, len(p) * " ")
corpus.translate(table)
table = str.maketrans(d, len(d) * " ")
corpus.translate(table)
print(corpus)
我得到的最终输出是:
This beautiful day16~ . I ; working exercise45.^^^45 text34 .
预期的输出应类似于:
This beautiful day I work exercise text
不,您当前的方法行不通,因为您必须一次将一个单词]传递给定词器/词干,否则,这些函数将不知道将字符串解释为句子(他们期望单词) 。
import re __stop_words = set(nltk.corpus.stopwords.words('english')) def clean(tweet): cleaned_tweet = re.sub(r'([^\w\s]|\d)+', '', tweets.lower()) return ' '.join([lemmatizer.lemmatize(i, 'v') for i in cleaned_tweet.split() if i not in __stop_words])
或者,您可以使用
PorterStemmer
,它与词法的实现相同,但是没有上下文。
from nltk.stem.porter import PorterStemmer stemmer = PorterStemmer()
并且,像这样称呼词干:
stemmer.stem(i)
我认为这是您要寻找的,但是在按注释者的说明调用定容器之前,请执行此操作。
要正确处理一条推文,您可以使用以下代码: