[英]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;
}
有人可以幫忙編碼嗎?
您可以應用標准信息檢索數據結構,尤其是倒排索引。 這是你如何做到的。
考慮你的原始句子。 使用一些整數標識符為它們編號,如下所示:
- “行政長官今天已接受提案201。”,
- “根據最近的主要決定,”建議214和221被接受“,
- “這項建議已獲主任接納。”,
- “提案3 MazerNo和補丁4都被主管接受了。”,
- “提案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.