我有一个班级
Class TextChunks extends Token {
ArrayList<Token> arrt = new ArrayList<Token>();
}
范围fron class:
class Token {
String s;
int frequency = 1 ;// Tern frequency in TextChunk
}
现在在令牌中我有arraylist令牌,我想在多个令牌相同的情况下更新Texchunks中令牌的属性频率。
显然,举个例子:
Texchunks:“特别是在某些领域和范围内”
所以有8个令牌:in,特别是in,domain,和range,in,some
我想要令牌的更新属性频率:在这个例子中当我得到令牌“in”的属性频率时必须返回3
这意味着当我打电话时:在发布时获得Texchunks的频率:
in 3
particular 1
in 3
domain 1
and 1
range 1
in 3
some 1
这里是我的代码:
public TextChunks updateFrequencyOfTokenInTextChunks (TextChunks tc) throws CloneNotSupportedException {
TextChunks result = (TextChunks) tc.clone();
for (int i =0 ; i< result.arrt.size() ; i++ ){
int j=i+1;
if (result.arrt.get(i).compareTwoToken(result.arrt.get(j))== true )
{
// help here how to update attribute result.arrt.get(i)
// and result.arrt.get(J) = ++ and
}
}
return tc;
}
先谢谢
这是方法比较两个标记
public boolean compareTwoToken(Token tk){
if(this.s.toLowerCase().trim().equals(tk.s.toLowerCase()))
return true;
return false;
}
答案 0 :(得分:2)
您的不完整算法不起作用,因为在j
的先前位置找不到i
。
一个可行的解决方案可能是:
updateFrequencyOfTokenInTextChunks
方法:
public static void updateFrequencyOfTokenInTextChunks (TextChunks tc) {
Hashtable<String,Integer> visited = new Hashtable<String,Integer>();
for (Token token : tc.arrt){
if (visited.containsKey(token.s)) {
token.frequency = visited.get(token.s);
} else {
int n = count(token, tc);
visited.put(token.s, n);
token.frequency = n;
}
}
}
我的解决方案没有返回任何类型,因为我理解 update (updateFrequencyOfTokenInTextChunks
)应修改参数(TextChunks tc
)并且不返回克隆。
count
辅助方法:
private static int count(Token t, TextChunks tc) {
int cont = 0;
for (Token token : tc.arrt) {
if ( t.compareTwoToken(token) ) {
cont++;
}
}
return cont;
}
答案 1 :(得分:1)
首先,你的循环被巧妙地打破了。你使用:
for (int i =0 ; i< result.arrt.size() ; i++ )
但是你引用了索引i+1
(通过j
)的项目,所以你已经有了一个一个一个错误。您需要将循环更改为result.arrt.size()-1
。其次,没有必要明确地将布尔值与true进行比较;它是多余的,使事情不必要混乱和混乱,通常被认为是穷人的风格。第三,除非您计划修改result
对象,否则您的克隆完全没有必要且浪费。现在,要回答您的问题,请将元素保存在变量中以使您的生活更轻松,然后只需更新字段,如下所示:
ArrayList<Token> tokens = tc.aart;
for (int i = 0; i < tokens.size() - 1; i++ ){
Token current = tokens.get(i);
Token next = tokens.get(i+1);
if ( current.compareTwoToken(next) ){
current.frequency = /* new value of frequency */
next.frequency = /* new value of frequency */
}
}
但请注意,由于字段frequency
尚未公开,因此需要由具有对Token类的包访问权限的代码执行。另外,您引用了compareTwoToken
,但在您发布的代码段中,您没有提供此类功能。
答案 2 :(得分:0)
您可以使用此代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TokenFrequency {
public static void main(String[] args) {
String text = "in particular in domain and range in some";
String[] tokens = text.split(" ");
System.out.println(Arrays.toString(tokens));
Set<String> uniqueTokens = new LinkedHashSet<String>(Arrays.asList(tokens)) ;
List<Token> list = new ArrayList<Token>();
for(String uniqueToken : uniqueTokens){
String regex = "\\b" + uniqueToken + "\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
int frequency = 0;
while (matcher.find()) {
frequency++;
}
Token token = new Token();
token.frequency = frequency;
token.s = uniqueToken;
list.add(token);
}
System.out.println(list);
}
}
答案 3 :(得分:0)
这里词的频率是它在句子中出现的次数。 你可以使用一个小代码
String sent ="in particular in domain and range in some";
StringTokenizer str = new StringTokenizer(sent, " ");
ArrayList<String> list = new ArrayList<String>();
while(str.hasMoreTokens()){
//System.out.println(str.nextToken());
list.add(str.nextToken());
}
上面的代码只是为了得到你所做的特别的话。 下面的代码有助于找到频率:
HashSet<String> st = new HashSet<String>();
st.addAll(list);
ArrayList<Token> arrt = new ArrayList<Token>();
for(String s:st){
Token token = new Token();
token.s=s;
token.frequency=Collections.frequency(list, s);
arrt.add(token);
}
因此,Collections.frequency()方法将为您提供集合中每个单词的频率。