如何在文本文档中查找频繁出现的短语
How to find freqeuntly occuring phrases in a text document
我有一个包含多个段落的文本文档。我需要一起找出经常出现的短语。
例如
患者姓名 xyz phone 否 12345 emailid xyz@abc.com
患者姓名 abc 地址 some us 地址
比较这些行,常见的短语是患者姓名。现在我可以在段落中的任何位置使用该短语。现在我的要求是使用 nlp 找到文档中最常出现的短语,而不考虑其位置。
你应该使用 n-grams
来计算连续的 n
单词出现的次数。因为你不知道有多少单词会重复,所以你可以尝试几个 n
for n-grams
,即。从 2 到 6。
Java ngrams 示例在 JDK 1.8.0
:
上测试
import java.util.*;
public class NGramExample{
public static HashMap<String, Integer> ngrams(String text, int n) {
ArrayList<String> words = new ArrayList<String>();
for(String word : text.split(" ")) {
words.add(word);
}
HashMap<String, Integer> map = new HashMap<String, Integer>();
int c = words.size();
for(int i = 0; i < c; i++) {
if((i + n - 1) < c) {
int stop = i + n;
String ngramWords = words.get(i);
for(int j = i + 1; j < stop; j++) {
ngramWords +=" "+ words.get(j);
}
map.merge(ngramWords, 1, Integer::sum);
}
}
return map;
}
public static void main(String []args){
System.out.println("Ngrams: ");
HashMap<String, Integer> res = ngrams("Patient name xyz phone no 12345 emailid xyz@abc.com. Patient name abc address some us address", 2);
for (Map.Entry<String, Integer> entry : res.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue().toString());
}
}
}
输出:
Ngrams:
name abc:1
xyz@abc.com. Patient:1
emailid xyz@abc.com.:1
phone no:1
12345 emailid:1
Patient name:2
xyz phone:1
address some:1
us address:1
name xyz:1
some us:1
no 12345:1
abc address:1
所以你看到 'Patient name' 的最大计数是多少,2 次。您可以将此函数与多个 n
值一起使用并检索最大出现次数。
Edit: I will leave this Python code here for historic reasons.
一个简单的 Python(使用 nltk
)工作示例来向您展示我的意思:
from nltk import ngrams
from collections import Counter
paragraph = 'Patient name xyz phone no 12345 emailid xyz@abc.com. Patient name abc address some us address'
n = 2
words = paragraph.split(' ') # of course you should split sentences in a better way
bigrams = ngrams(words, n)
c = Counter(bigrams)
c.most_common()[0]
这给你输出:
>> (('Patient', 'name'), 2)
我有一个包含多个段落的文本文档。我需要一起找出经常出现的短语。
例如
患者姓名 xyz phone 否 12345 emailid xyz@abc.com 患者姓名 abc 地址 some us 地址
比较这些行,常见的短语是患者姓名。现在我可以在段落中的任何位置使用该短语。现在我的要求是使用 nlp 找到文档中最常出现的短语,而不考虑其位置。
你应该使用 n-grams
来计算连续的 n
单词出现的次数。因为你不知道有多少单词会重复,所以你可以尝试几个 n
for n-grams
,即。从 2 到 6。
Java ngrams 示例在 JDK 1.8.0
:
import java.util.*;
public class NGramExample{
public static HashMap<String, Integer> ngrams(String text, int n) {
ArrayList<String> words = new ArrayList<String>();
for(String word : text.split(" ")) {
words.add(word);
}
HashMap<String, Integer> map = new HashMap<String, Integer>();
int c = words.size();
for(int i = 0; i < c; i++) {
if((i + n - 1) < c) {
int stop = i + n;
String ngramWords = words.get(i);
for(int j = i + 1; j < stop; j++) {
ngramWords +=" "+ words.get(j);
}
map.merge(ngramWords, 1, Integer::sum);
}
}
return map;
}
public static void main(String []args){
System.out.println("Ngrams: ");
HashMap<String, Integer> res = ngrams("Patient name xyz phone no 12345 emailid xyz@abc.com. Patient name abc address some us address", 2);
for (Map.Entry<String, Integer> entry : res.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue().toString());
}
}
}
输出:
Ngrams:
name abc:1
xyz@abc.com. Patient:1
emailid xyz@abc.com.:1
phone no:1
12345 emailid:1
Patient name:2
xyz phone:1
address some:1
us address:1
name xyz:1
some us:1
no 12345:1
abc address:1
所以你看到 'Patient name' 的最大计数是多少,2 次。您可以将此函数与多个 n
值一起使用并检索最大出现次数。
Edit: I will leave this Python code here for historic reasons.
一个简单的 Python(使用 nltk
)工作示例来向您展示我的意思:
from nltk import ngrams
from collections import Counter
paragraph = 'Patient name xyz phone no 12345 emailid xyz@abc.com. Patient name abc address some us address'
n = 2
words = paragraph.split(' ') # of course you should split sentences in a better way
bigrams = ngrams(words, n)
c = Counter(bigrams)
c.most_common()[0]
这给你输出:
>> (('Patient', 'name'), 2)