2016-11-04 2 views
0

Может ли кто-нибудь сказать мне, как я могу рассматривать слова вокруг данного слова? Пример: Если у нас есть предложение: «Сегодня погода прекрасна, и мы любим ходить». Затем, если размер окна 5, я хотел бы получить следующее:Возьмите несколько слов с центром в указанном

  • Сегодня погода (центр: "Сегодня")
  • Сегодня погода (в центре: "The")
  • Сегодня погода хорошая (в центре: «погода»)
  • погода хорошая и (в центре: «есть»)
  • погода хорошая, и мы (в центре: «отлично»)
  • прекрасно и мы любим (в центре: «и»)

и так далее. Учитывая биграммы не проблема:

bigrams = [p for s in corpus_lemm for p in nltk.bigrams(w for w in s)] #take bigrams inside of each sentence 

Но как я могу считать слова заданного размера окна?

Большое спасибо за помощь!

+0

я прошу прощения, но я не понимаю, почему эти строки генерируются, когда размер окна 5 – rassar

+0

Ну, для первого примера, центр «сегодня»: 2 слова, прежде чем ничего, 2 слов после «погода» и «погода». Для второго примера центр - это «the»: 2 слова перед «Сегодня», 2 после: «погода» и «есть». Для третьего примера центр - это «погода». 2 слова до «Сегодня» и «the», 2 после: «is» и «fine». 4-й пример: центр «есть», 2 слова до: «the» и «weather», 2 после: «fine »и« и ». И т. д. – JohnD

+0

Список наименований - самый простой способ. Я оставляю детали вам как упражнение. –

ответ

0

Извините, у меня нет большого контроля над Python, но в JS можно было выполнить эту работу следующим образом. В надежде, вы можете реализовать его в Python.

var str = "Today the weather is fine and we love to walk.", 
 
    arr = str.split(/\s+/), 
 
    win = 5, 
 
result = arr.map((w,i,a) => Array(win).fill() 
 
             .map((e,j) => a[i + j + -1 * Math.floor(win/2)]) 
 
             .reduce((p,c) => p ? c ? p + " " + c 
 
                   : p 
 
                  : c)); 
 
console.log(result);

В соответствии с Вашим комментарием ... в то время как приклеить тот же алгоритм, я мог бы расширить свой ответ следующим образом.

var arr = [1,2,3,4,5,6,7,8], 
 
    win = 5, 
 
result = arr.map((_,i,a) => Array(win).fill() 
 
             .map((e,j) => a[i + j + -1 * Math.floor(win/2)]) 
 
             .reduce((p,c) => p ? c ? [].concat(p,c) 
 
                   : p 
 
                  : c ? c 
 
                   : undefined)); 
 
console.log(JSON.stringify(result));

+0

Hm, но если у меня есть следующий массив: a = [1, 2 , 3, 4, 5, 6, 7, 8]. Результат должен быть: a [0: 3], a [0: 4], a [0: 5], a [1: 6], a [2: 7], [3: 8], a [4 : 8], a [5: 8]. Нет ли решения, которое проще? – JohnD

+0

Большое спасибо за ваш ответ. Я мог бы решить это, используя ngrams nltk, которые делают почти то же самое :) – JohnD

0

Я не совсем уверен, что я понимаю кадрирование, но, как представляется, вывод, который вы хотите.

s = "Today the weather is fine and we love to walk" 
words = s.split() 
win_len = 5 

half_win = win_len // 2 

print "\n".join(words[:half_win]) 

for i in range(len(words) - win_len + 1): 
    window = words[i:i+win_len] 
    # print " ".join(window) 
    print window[len(window) // 2] 

print "\n".join(words[-half_win:]) 

Выходы

Today 
the 
weather 
is 
fine 
and 
we 
love 
to 
walk 
+0

Hm, но если у меня есть следующий массив: a = [1, 2, 3, 4, 5, 6, 7, 8]. Результат должен быть: a [0: 3], a [0: 4], a [0: 5], a [1: 6], a [2: 7], [3: 8], a [4 : 8], a [5: 8]. Нет ли решения, которое проще? – JohnD

+0

Определите «проще». Что не так с ответом, который я дал? Он дает выходные заявления, которые вы хотели, нет? –

+0

А я мог бы решить это, используя ngrams nltk. – JohnD

0

Вы можете использовать list.index и список нарезку для получения нужных слов.

def words(text, search, window): 
    words = s.split() 
    i = words.index(search) 

    low = i - window // 2 
    high = low + window 
    low = max(low, 0) 

    return words[low:high] 
Смежные вопросы