После долгих поисков я не нашел ответа на свой вопрос, поэтому решил поставить свой вопрос здесь. Я пытаюсь добиться какого-то определенного c результата с RE и NLTK. Учитывая предложение, для каждого символа я должен использовать формат BIS
, то есть помечать каждый символ как B (beginning of the token)
, I (intermediate or end position of the token)
, S for space
. Например, с учетом предложения:
Ручка находится на столе.
Система должна будет предоставить следующий вывод:
BIISBIISBISBISBIISBIIIIB
который можно прочитать как:
<3-char token> <space> <3-char token> <space> <2-char token> <space> <2-char token> <space> <3-char token> <space> <5-char token> <1-char token>)
Мой результат довольно близок, но вместо:
BIISBIISBISBISBIISBIIIIB
Я получаю:
BIISBIISBISBISBIISBIIIISB
Значение Я получаю пробел между table
и точкой .
Выходные данные должны быть:
<3-char token> <space> <3-char token> <space> <2-char token> <space> <2-char token> <space> <3-char token> <space> <5-char token> <1-char token>
Мое:
<3-char token> <space> <3-char token> <space> <2-char token> <space> <2-char token> <space> <3-char token> <space> <5-char token> <space> <1-char token>
Мой код пока:
from nltk.tokenize import word_tokenize
import re
p = "The pen is on the table."
# Split text into words using NLTK
text = word_tokenize(p)
print(text)
initial_char = [x.replace(x[0],'B') for x in text]
print(initial_char)
def listToString(s):
# initialize an empty string
str1 = " "
# return string
return (str1.join(s))
new = listToString(initial_char)
print(new)
def start_from_sec(my_text):
return ' '.join([f'{word[0]}{(len(word) - 1) * "I"}' for word in my_text.split()])
res = start_from_sec(new)
p = re.sub(' ', 'S', res)
print(p)