簡體   English   中英

在句子中的詞cooccurence

[英]Word cooccurence in sentences

我在一個文件中有一大組句子(10,000)。 該文件包含每個文件一個句子。 在整個集合中,我想找出一個句子中出現的單詞及其頻率。

例句:

"Proposal 201 has been accepted by the Chief today.", 
"Proposal 214 and 221 are accepted, as per recent Chief decision",     
"This proposal has been accepted by the Chief.",
"Both proposal 3 MazerNo and patch 4 have been accepted by the Chief.",     
"Proposal 214, ValueMania, has been accepted by the Chief."};

我想編寫以下輸出。 我應該能夠提供三個起始單詞作為程序參數:“Chief,accepted,Proposal”

Chief accepted Proposal            5
Chief accepted Proposal has        3
Chief accepted Proposal has been   3

... 
...
for all combinations.

我知道組合可能很大。

我在網上搜索但找不到。 我寫了一些代碼,但無法理解它。 也許知道域名的人可能知道。

ReadFileLinesIntoArray rf = new ReadFileLinesIntoArray();

            try {
                String[] tmp = rf.readFromFile("c:/scripts/SelectedSentences.txt");
                for (String t : tmp){
                      String[] keys = t.split(" ");
                      String[] uniqueKeys;
                      int count = 0;
                      System.out.println(t);
                      uniqueKeys = getUniqueKeys(keys);
                        for(String key: uniqueKeys)
                        {
                            if(null == key)
                            {
                                break;
                            }           
                            for(String s : keys)
                            {
                                if(key.equals(s))
                                {
                                    count++;
                                }               
                            }
                            System.out.println("Count of ["+key+"] is : "+count);
                            count=0;
                        }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

private static String[] getUniqueKeys(String[] keys) {
        String[] uniqueKeys = new String[keys.length];

        uniqueKeys[0] = keys[0];
        int uniqueKeyIndex = 1;
        boolean keyAlreadyExists = false;

        for (int i = 1; i < keys.length; i++) {
            for (int j = 0; j <= uniqueKeyIndex; j++) {
                if (keys[i].equals(uniqueKeys[j])) {
                    keyAlreadyExists = true;
                }
            }

            if (!keyAlreadyExists) {
                uniqueKeys[uniqueKeyIndex] = keys[i];
                uniqueKeyIndex++;
            }
            keyAlreadyExists = false;
        }
        return uniqueKeys;
    }

有人可以幫忙編碼嗎?

您可以應用標准信息檢索數據結構,尤其是倒排索引。 這是你如何做到的。

考慮你的原始句子。 使用一些整數標識符為它們編號,如下所示:

  1. “行政長官今天已接受提案201。”,
  2. “根據最近的主要決定,”建議214和221被接受“,
  3. “這項建議已獲主任接納。”,
  4. “提案3 MazerNo和補丁4都被主管接受了。”,
  5. “提案214,ValueMania,已被主管接受。”

對於您在句子中遇到的每對單詞,將其添加到倒置索引,該索引將該對映射到句子標識符的集合(一組唯一項)。 對於長度為N的句子,有N-choose-2對。

適當的Java數據結構將是Map<String, Map<String, Set<Integer>> 按字母順序排列對,以便“有”和“建議”對僅出現(“有”,“建議”)而不出現(“建議”,“有”)。

此地圖將包含以下內容:

"has", "Proposal" --> Set(1, 5)
"accepted", "Proposal" --> Set(1, 2, 5)
"accepted", "has" --> Set(1, 3, 5)
etc.

例如,單詞對“has”和“Proposal”具有一組(1,5),意味着它們在句子1和5中找到。

現在假設您要查找“已接受”,“有”和“提案”列表中單詞的共現次數。 生成此列表中的所有對並與其各自的列表相交(使用Java的Set.retainAll() )。 這里的結果將最終設置為(1,5)。 它的大小為2,意味着有兩個句子包含“已接受”,“有”和“提案”。

要生成所有對,只需根據需要迭代地圖。 要生成大小為N的所有單詞元組,您需要根據需要迭代並使用遞歸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM