2017-11-20 2 views
0

다음과 같이 항목 코드의 여러 행을 포함하는 파일이 있습니다. 난은 kdb +에서 Q를 사용하여 파일에서 한 줄에 단어/모든 항목 쌍의 수를 찾고자하는 이들kdb에서 단어 쌍 수 찾기 +

1. 123,134,256,345,789..... 
    2. 123,256,345,678,789...... 
    . 
    . 

과 비슷한 100 만 개 행이 있습니다. 즉 동일한 행에 발생하는 임의의 2 쌍의 단어는 단어 쌍으로 간주 될 수있다. 예 :

(123,134) (123,256) (134,256) (123,345) (123,789) (134,789)는 (123,345), 1 행 (123,256)에서 (123,345)를 단어 쌍 중 일부 (678,789) (345,789)은 행의 단어 쌍의 일부입니다 2

word/item pair count 

`123,134----1 
    123,256---2 
    345,789---2` 

내가 read0을 사용하여 파일을 읽고있다와의 수를 계산 vsusing count each group를 사용하여 목록에 각 행을 변환 할 수 있었다 단어 수는 있지만 파일의 행당 모든 단어 쌍 수를 찾고 싶습니다. 당신의 도움이

답변

1

나는 100 % 아니에요 사전에

덕분에 나는 단어 쌍 당신의 정의를 이해합니다. 내 논리가 당신이 찾던 것과 일치하지 않는다면 아마도 조금 확장 할 수있을 것입니다.

아래 예제에서는 각 행에서 값의 뚜렷한 쌍을 선택한 다음 이들이 각각 얼마나 많은 행에 모두 나타나는지 확인하기 위해 테스트 용 기호 5x5 matrice를 작성했습니다.

결과를 다시 확인하십시오.

q)test:5 cut`$string 25?5 

q)test 
2 0 1 0 0 
2 4 4 2 0 
1 0 0 3 4 
2 1 1 4 4 
3 0 3 4 0 

q)count each group raze {l[where(count'[l:distinct distinct each asc'[x cross x:distinct x]])>1]} each test 
0 2| 2 
1 2| 2 
0 1| 2 
2 4| 2 
0 4| 3 
1 3| 1 
1 4| 2 
0 3| 2 
3 4| 2 

종류와 관련, 매트

1

당신이 원하는 것은 이런 식으로 쌍으로 다운 목록을 중단하는 경우, 위의 매튜의 대답에 다른 사례를 추가하려면 :

l:"a,b,c,d,e,f,g" 

가된다

"a,b" 
"b,c" 
"c,d" 
"d,e" 
"e,f" 
"f,g" 

유효한 쌍만 사용하면 다음과 같은 것을 사용할 수 있습니다. 이 :

우리가 입력 목록을 분할하고, 그 다음 오른쪽에 직접 각 요소의 목록과 요소를 얻기 위해 색인을 사용하여 다음을 계산 쌍 결과 목록을 그룹화
f:{count each group b flip 0 1+\:til 1+count[b:","vs x]-1} 

q)f l 
,"a" ,"b"| 1 
,"b" ,"c"| 1 
,"c" ,"d"| 1 
,"d" ,"e"| 1 
,"e" ,"f"| 1 
,"f" ,"g"| 1 

"." 뚜렷한 쌍. 난

"a,b" 
"c,d" 
"e,f" 

가되도록 당신이 그것을 분할 할 경우, 당신은이를 사용할 수 있습니다

짝수 위치 요소에서 시작하여 자신의 오른쪽에있는 사람들을 받고, 비슷한 방법을 사용
g:{count each group b flip 0 1+\:2*til count[b:","vs x]div 2} 

q)g l 
,"a" ,"b"| 1 
,"c" ,"d"| 1 
,"e" ,"f"| 1 

하고, 상기와 같이 반복한다. 쉽게 read0 읽을 행에 다음을 적용 할 수

r:read0`:file.txt 
f each r 

출력됩니다 각 행에 대해 각 쌍의 카운트의 사전,이 각 각 단어 쌍의 총 수를 제공하는 요약 할 수 메소드를 호출합니다.

호프가 도움이 되었기를 바랍니다. 페어가 의미하는 바가 아직 명확하지 않으므로 Matthew가 아닌 ​​일부 대답을 사용하지 않으면 원하는 내용을 더 자세히 설명하고 도움을 줄 수 있습니다. .

1

각 행에 2 쌍의 모든 가능한 조합을 고려하려면 도움이 될 수 있습니다. 다음, 우리는 각 목록에 인덱스가 쌍을 얻을 수 있습니다 여기에서 raze

q)comb:{$[x=y;enlist til x;1=y;flip enlist til x;.z.s[x;y],.z.s[x;y-1],'x-:1]} 
q)comb[3;2] 
0 1 
0 2 
1 2 

: 다음 함수는 목록의 크기가 어디 x하고 y이 조합의 길이, 독특한 조합을 제공 할 수 있습니다 각 쌍을 발생하는 위치의 인덱스를 얻기 위해, group 모든 쌍의 하나의리스트를 제공하고 count 각 그룹 인덱스의 수 :

q)a 
123 134 256 345 789 
123 256 345 678 789 
q)count each group raze{x comb[count x;2]}'[a] 
123 134| 1 
123 256| 2 
134 256| 1 
... 
345 789| 2 
... 

안부

Thomas Smyth, AquaQ Analytics