2016-11-04 3 views
0

주어진 단어 주위의 단어를 어떻게 생각할 수 있습니까? 예 : "오늘 날씨가 좋으며 걷기를 좋아합니다."라는 문장이있는 경우지정된 단어를 중심으로 여러 단어 가져 오기

  • 오늘의 날씨 (중앙 : "오늘") 날씨는
  • 오늘 (센터 "은")
  • 창 크기가 5이면 다음, 나는 다음을 좀하고 싶습니다
  • 날씨가 괜찮과 :
  • 오늘 날씨가 좋은 ("날씨"센터)입니다 (센터 "입니다")
  • 날씨는 괜찮 우리 (중앙 : "벌금")
  • 괜찮 및 우리는 사랑한다 (중심 : "and")

등등.

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

그러나이 어떻게 주어진 윈도우 크기의 말씀을 고려할 수 : 고려 bigrams 아무 문제 없다?

도움을 주셔서 감사합니다.

+0

내가 미안하지만, 그 문자열이 발생하는 이유 창 크기가 첫 번째 예를 들어, 5 – rassar

+0

잘 때 이해가 안가, 센터는 "오늘"입니다 후에 "the"와 "weather"가 있습니다. 두 번째 예에서 중심은 "the"입니다. 앞에 2 단어는 "Today"이고 2 뒤에는 "weather"와 "is"가 있습니다. 세 번째 예에서 중심은 "날씨"입니다. 두 번째 단어는 "오늘"과 "그 다음에 2": "is"와 "fine"이됩니다. 4 번째 예 : "is", 2 단어 앞에 : "the"와 "weather", 2 after : "fine "and"and ". 기타 – JohnD

+0

목록 분할은 가장 간단한 방법입니다. 연습으로 세부 정보를 남깁니다. –

답변

0

미안하지만 나는 파이썬을 많이 통제하지 못했지만 JS에서는 다음과 같이 일할 수 있었다. 희망과 함께, 당신은 그것을 파이썬으로 구현할 수 있습니다. 다음과 같이

의견으로 당

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

흠, 다음 배열이있는 경우 : a = [1, 2 , 3, 4, 5, 6, 7, 8]. 결과는 a [0 : 3], a [0 : 4], a [0 : 5], a [1 : 6], a [2 : 7], a [3 : 8], [4 : 8], a [5 : 8]. 더 쉬운 해결책이 없습니까? – JohnD

+0

답변 해 주셔서 감사합니다. 나는 거의 같은 일을 nltk의 ngrams를 사용하여 해결할 수 있습니다 :) – 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

하지만 다음 배열이 있다면 : = [1, 2, 3, 4, 5, 6, 7, 8]. 결과는 a [0 : 3], a [0 : 4], a [0 : 5], a [1 : 6], a [2 : 7], a [3 : 8], [4 : 8], a [5 : 8]. 더 쉬운 해결책이 없습니까? – JohnD

+0

"쉽게"정의하십시오. 내가 제공 한 답에 무엇이 잘못 되었습니까? 원하는 출력 문을 제공합니다. 그렇지 않습니다. –

+0

아, nltk의 ngram을 사용하여 문제를 해결할 수있었습니다. – JohnD

0

당신이 원하는 단어를 검색 할 수 list.index 및 목록 슬라이스를 사용할 수 있습니다. 이 개 단어의 전, 2 개 단어입니다 :

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] 
관련 문제