Это неожиданный результат. In
возвращает заглавные буквы In
из вывода PorterStemmer.
>>> from nltk.stem import PorterStemmer
>>> porter = PorterStemmer()
>>> porter.stem('In')
'In'
Подробнее на https://stackoverflow.com/q/60387288/610569
Разве мы не должны сначала преобразовать их в нижний регистр как часть нормализации для любого стемминга?
Другой пример вывода с Oh
буквы с использованием
>>> from nltk.stem import PorterStemmer
>>> porter = PorterStemmer()
>>> porter.stem('Oh')
'Oh'
Я думаю, это потому, что изначально он хотел сохранить первоначальную форму сокращений, когда длина слова меньше 2, например, сокращения для состояний.
def stem(self, word):
stem = word.lower()
if self.mode == self.NLTK_EXTENSIONS and word in self.pool:
return self.pool[word]
if self.mode != self.ORIGINAL_ALGORITHM and len(word) <= 2:
# With this line, strings of length 1 or 2 don't go through
# the stemming process, although no mention is made of this
# in the published algorithm.
return word
stem = self._step1a(stem)
stem = self._step1b(stem)
stem = self._step1c(stem)
stem = self._step2(stem)
stem = self._step3(stem)
stem = self._step4(stem)
stem = self._step5a(stem)
stem = self._step5b(stem)
return stem
Слова «In» и «Oh» отсутствуют в self.pool
и len(word)<=2
, что означает, что оно не удовлетворяет здесь основному условию, поэтому остается неизменным.
Если он не назначен, могу ли я поработать над этим? Я впервые участвую в проекте.
@PhanatosZou не стесняйтесь вносить изменения и создавать запросы на вытягивание. Основной код, который необходимо изменить:
if self.mode != self.ORIGINAL_ALGORITHM and len(word) <= 2:
# With this line, strings of length 1 or 2 don't go through
# the stemming process, although no mention is made of this
# in the published algorithm.
return stem
Но было бы хорошо проверить все ключи в self.pool
и если они не заглавные, то тоже внесите в это изменения:
if self.mode == self.NLTK_EXTENSIONS and word in self.pool:
return self.pool[stem]
Звучит отлично! Я буду работать над этим.