Есть ли лучший способ токенизировать некоторые строки? - PullRequest
0 голосов
/ 15 января 2019

Я пытался написать код для токенизации строк в python для некоторого НЛП и придумал этот код:

str = ['I am Batman.','I loved the tea.','I will never go to that mall again!']
s= []
a=0
for line in str:
    s.append([])
    s[a].append(line.split())
    a+=1
print(s)

выход получился:

[[['I', 'am', 'Batman.']], [['I', 'loved', 'the', 'tea.']], [['I', 'will', 'never', 'go', 'to', 'that', 'mall', 'again!']]]

Как видите, в списке теперь есть дополнительное измерение, например, если я хочу слово «Бэтмен», мне нужно будет ввести s[0][0][2] вместо s[0][2], поэтому я изменил код на:

str = ['I am Batman.','I loved the tea.','I will never go to that mall again!']
s= []
a=0
m = []
for line in str:
    s.append([])
    m=(line.split())
    for word in m:
        s[a].append(word)
    a += 1
print(s)

, который дал мне правильный вывод:

[['I', 'am', 'Batman.'], ['I', 'loved', 'the', 'tea.'], ['I', 'will', 'never', 'go', 'to', 'that', 'mall', 'again!']]

Но у меня такое чувство, что это может работать с одним циклом, потому что набор данных, который я буду импортировать, будет довольно большим, а сложность n будет намного лучше, чем n^2, поэтому есть лучший способ сделать это / способ сделать это с одним циклом?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Смотрите это: -

>>> list1 = ['I am Batman.','I loved the tea.','I will never go to that mall again!']
>>> [i.split() for i in list1]  
# split by default slits on whitespace strings and give output as list

[['I', 'am', 'Batman.'], ['I', 'loved', 'the', 'tea.'], ['I', 'will', 'never', 'go', 'to', 'that', 'mall', 'again!']]
0 голосов
/ 15 января 2019

Ваш оригинальный код уже почти у цели.

>>> str = ['I am Batman.','I loved the tea.','I will never go to that mall again!']
>>> s=[]
>>> for line in str:
...   s.append(line.split())
...
>>> print(s)
[['I', 'am', 'Batman.'], ['I', 'loved', 'the', 'tea.'], ['I', 'will', 'never', 'go', 'to', 'that', 'mall', 'again!']]

line.split() дает вам список, поэтому добавьте его в свой цикл. Или идите прямо к пониманию:

[line.split() for line in str]

Когда вы говорите s.append([]), у вас есть пустой список с индексом 'a', например:

L = []

Если вы добавите к этому результат split, например L.append([1]), вы получите список в этом списке: [[1]]

0 голосов
/ 15 января 2019

Вы должны использовать split() для каждой строки в цикле

Пример с пониманием списка:

str = ['I am Batman.','I loved the tea.','I will never go to that mall again!']

[s.split() for s in str]

[['I', 'am', 'Batman.'],
 ['I', 'loved', 'the', 'tea.'],
 ['I', 'will', 'never', 'go', 'to', 'that', 'mall', 'again!']]
...