我正在进行一些POS-tagger分析,我需要更换一些标签。 我正在使用正则表达式来标识标记:
Regex regex = new Regex(@"/(?<firstMatch>[^\s]+)( )");
//“/”和“”之间的任何内容,示例代码:/ NN,/ VB等......
现在,我将标签名称转换为firstMatch组,因此我可以像
一样访问它们foreach (Match m in regex.Matches(allText))
{
Console.WriteLine(m.Groups["firstMatch"].Value);
}
我想要做的是用其他标签替换标签名称,具体取决于它的名称。 比如,如果标签名称是DTI,我想用DT替换它。如果它是NNS,我想用NN替换它。依此类推,从我拥有的标签列表中。我能这样做吗? 我在想是否有匹配替换所以我可以使用它。
谢谢!
答案 0 :(得分:2)
Dictionary<string,string> tags = new Dictionary<string,string>();
public string UpadeInput(String input)
{
tags.Add("DTI", "DT");
tags.Add("NNS", "NN");
tags.Add("LongAnnoyingTag", "ShortTag");
MatchEvaluator evaluator = new MatchEvaluator(ModifyTag);
return Regex.Replace(input,@"(?<=/)(?<firstMatch>[^\s]+)(?= )", evaluator);
}
public string ModifyTag(Match match)
{
return tags[match.Value];
}
编辑的编辑。
您只需更改ModifyTag
方法即可使用不同的情况。
public string ModifyTag(Match match)
{
String tag = match.Value;
if(!tag.Contains("+"))
{
return tags[match.Value];
}
else
{
string[] composedTags = tag.Split('+');
return String.Format("{0}+{1}", tags[composedTags[0]], tags[composedTags[1]]);
}
}
答案 1 :(得分:0)
如果我理解你的问题
Regex.Replace(input,"/(?<firstMatch>[^\s]+)[^\s](?= )","$1");
这将使用相同的标记名称替换标记名称,但最后一个字符除外。