Если вы запустите
for word in nltk_text.vocab():
if 'whale' in word.lower():
print(word)
, вы увидите длинный список слов, таких как
whale-ship
whale-lance
whale-fishery
right-whale
sperm-whale
, которые не учитываются как whale
Если вы проверите их с регулярным выражением вы видите, что он считает их whale
print(len(re.findall(r'\b(whale)\b', 'whale-hunter whale-lance whale-fishery right-whale sperm-whale')))
# prints 5
РЕДАКТИРОВАТЬ:
Используя этот код, я обнаружил несколько ситуаций, когда nltk
и regex
дает разные результаты
import nltk
import re
with open('Pulpit/moby10b.txt') as f:
raw_text = f.read()
# --- get all `whale` with few chars around (-4, +10)
word_length = len('whale')
words = []
# search first word at position 0
position = raw_text.find('whale', 0)
while position != -1:
# get word (with few chars around)
start = position - 4
end = position + word_length + 10
word = raw_text[start:end]
# add word to list
words.append(word)
# search next word at position `position+1`
position = raw_text.find('whale', position+1)
# --- test words with nltk and regex
for word in words:
nltk_text = nltk.Text(nltk.word_tokenize(word))
number_1 = nltk_text.vocab()['whale']
number_2 = len(re.findall(r'\b(?<!-)(whale)(?!-)\b', word))
if number_1 != number_2:
print(number_1, number_2, word)
print('-----')
Результат:
1 0 ite whale--did ye m
-----
1 0 ite whale--shirr! s
-----
1 0 erm
whale--squid or
-----
0 1 erm whale's
head em
-----
0 1 the whale's
Decapit
-----
0 1 the whale's
headlon
-----
0 1 the whale's
eyes ha
-----
1 0 EAD whale--even as
-----
0 1 the whale's
flukes
-----
1 0 one whale--as a sol
-----
0 1 the whale's
vocabul
-----
1 0 rst
whale--a boy-ha
-----
1 0 the whale--modifyin
-----
Я показываю две ситуации
whale--
с двойным -
nltk
считает, но regex
не считает.
whale's\nhead
с \n
между whale's
и следующим заголовком слова
nltk
не учитывает его (но вместо этого он считается, когда есть место \n
или когда есть место после / до \n
), но regex
учитывает его в каждой ситуации.