2017-01-15 51 views
6

Pracuję nad zadaniem NLP i potrzebuję obliczyć matrycę współstosowania nad dokumentami. Podstawowa formuła jest następująca:Python - oblicz macierz współwystępowania

Tutaj mam matrycę o kształcie (n, length), gdzie każdy wiersz reprezentuje zdanie złożone z length słów. Tak więc są w sumie zdania o długości równej. Następnie z określonym rozmiarem kontekstu, np. window_size = 5, chcę obliczyć matrycę współwystępowania D, gdzie wpis w kolumnie cth i wth jest #(w,c), co oznacza, ile razy słowo kontekstowe c pojawi się w w ' s kontekst.

Przykład można znaleźć tutaj. How to calculate the co-occurrence between two words in a window of text?

Wiem, że można go obliczyć za pomocą pętli układania, ale chcę wiedzieć, czy kończy się prosty sposób lub prosta funkcja? Mam kilka odpowiedzi, ale nie mogą pracować z oknem przesuwającym się przez zdanie. Na przykład: word-word co-occurrence matrix

Czy ktoś mógłby mi powiedzieć, czy w Pythonie istnieje jakaś funkcja zwięzła w rozwiązywaniu tego problemu? Bo myślę, że to zadanie jest dość powszechne w rzeczach NLP.

Odpowiedz

4

To nie jest takie skomplikowane, jak sądzę. Dlaczego nie zrobić dla siebie funkcji? Najpierw należy uzyskać macierz wystąpienia X według tego samouczka: http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage Następnie dla każdego sentymentu obliczyć współwystępowanie i dodać je do zmiennej sumarycznej.

m = np.zeros([length,length]) # n is the count of all words 
def cal_occ(sentance,m): 
    for i,word in enumerate(sentance): 
     for j in range(min(i-window,0),min(i+window,length)): 
      m[word,sentance[j]]+=1 
for sentance in X: 
    cal_occ(sentance, m) 
+0

Wielkie dzięki. Widziałem funkcję 'CountVectorizer', ale zdarzenie, które oblicza, nie jest tym, czego chcę tutaj. W macierzy występowania mam na myśli tutaj, każda pozycja reprezentuje wystąpienie ** centralnego ** słowa 'w' i jego kontekstowego słowa' c'. Funkcja w 'CountVectorizer' po prostu obliczyć każdą parę słowa występującego w zdaniu. Mogę to osiągnąć tylko przy użyciu stosu pętli i zastanawiam się, czy proste API wychodzi. Dziękuję za odpowiedź :) –

+0

@GEORGEGUO Przepraszam za błędne użycie CountVectorizera. Ale możesz bezpośrednio użyć zapisanych sentances z kodem, który podałem. Krótko mówiąc, nie jest to skomplikowane i możesz zrobić takie "API" samodzielnie. – Zealseeker

+0

Wiem o tym. Dzięki –