如何将段落转换为词根
本文关键字:转换 段落 | 更新日期: 2023-09-27 18:35:10
对不起,我正在尝试制作简单的应用程序,将单词转换为单词
。 例如。启用 = 能够付款 = 付款
我的记事本上的文字是"启用付款"
我使用了上面的 2 个示例单词,但我没有得到我需要的东西。 我在记事本上写了"启用"和"付款".txt。 然后应用程序将启动并获取单词。
应用程序将开始修剪单词,将"En"和"ment"切入,以便它们的结果将是"能够"和"支付"
我的应用程序可以将单个单词"启用"修剪为"能够"。 和"付款"到"支付"但是,如果我写 2 个或更多单词,例如"启用付款"或"启用付款",该应用程序无法正常工作
这是用户界面图像
这是源代码,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace KTM'
{
public partial class KTM : Form
{
public string notepad;
public KTM()
{
InitializeComponent();
textBox1.Enabled=false;
button2.Enabled = false;
button3.Enabled = false;
}
void enable()
{
button2.Enabled = true;
button3.Enabled = true;
}
private void button1_Click(object sender, EventArgs e)
{
string dir = Application.StartupPath.ToString();
OpenFileDialog fdlg = new OpenFileDialog();
fdlg.Title = "Open *txt files";
fdlg.InitialDirectory = @dir;
fdlg.Filter = "Text files (*.txt)|*.txt|Text Files (*.txt)|*.txt";
fdlg.FilterIndex = 2;
fdlg.RestoreDirectory = true;
if (fdlg.ShowDialog() == DialogResult.OK)
{
textBox1.Text = fdlg.FileName;
}
else
{
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Text.Equals(""))
{
}
else
{
enable();
}
}
private void button2_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
StreamReader sr = new StreamReader(notepad);
string paragraf = sr.ReadToEnd();
sr.Close();
string[] kata = paragraf.Split(' ');
int i = 0;
//MessageBox.Show(kata[0]+" "+kata[1]+" "+kata[2]);
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
i++;
StreamWriter sw = new StreamWriter(notepad);
i = 0;
foreach (string ambil in kata)
{
sw.Write(kata[i]+" ");
}
i++;
sw.Flush();
sw.Close();
MessageBox.Show("Converted and Saved ","KTM Stemming",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
private void button3_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
System.Diagnostics.Process.Start(notepad);
}
}
}
你说循环设计不当。 由于您正在更新循环中的数组,因此最好使用迭代器执行一个简单的 for 循环:
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
但是,在第二个循环中,foreach 是有意义的。 但是,您需要使用 ambil 变量:
foreach (string ambil in kata)
{
sw.Write(ambil + " ");
}
编辑:
你说上面行不通,但对我有用。 也许您的问题与表单中的其他一些代码有关。 由于在同一方法中混合不同类型的逻辑不是好的做法,因此我建议将根词解析逻辑分解为自己的方法,例如:
private string getRootWords(string paragraf)
{
string[] kata = paragraf.Split(' ');
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if (kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
StringBuilder builder = new StringBuilder();
foreach (string ambil in kata)
{
builder.Append(ambil + " ");
}
return builder.ToString();
}
这种方法对我有用。 当我调用getRootWords("Enable payment")
时,它返回"able pay",据我所知,这是您想要的输出。
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
这是您问题的一部分,因为它是 foreach,但您像 for 循环一样使用它。 您可能还希望写入 for 循环之外的文件for (int i=0; i<kata.Length; i++)
因此您需要将写入内容放入 for 循环中,或者创建另一个 for 循环。
您将索引变量递增i
循环外部,您应该在循环内递增它:
foreach (string ambil in kata)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
i++;
}
最好还是直接使用 for
循环(您没有使用 ambil
变量):
for (i=0; i<kata.Lenght; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
}
if(kata[i].EndsWith("ment"))
{
int len = kata[i].Length;
int kepake = len - 4;
kata[i] = kata[i].Substring(0, kepake);
}
}
谢谢你们的帮助! :)我真的很感激,虽然我不明白一些答案:D至少你们帮我构建逻辑,我像这样解决我的问题
private void button2_Click(object sender, EventArgs e)
{
notepad = textBox1.Text;
StreamReader sr = new StreamReader(notepad);
string paragraf = sr.ReadToEnd();
sr.Close();
StreamWriter sw = new StreamWriter(notepad);
string[] kata = paragraf.Split(' ');
for (int i = 0; i < kata.Length; i++)
{
if (kata[i].StartsWith("en"))
{
kata[i] = kata[i].Substring(2);
//cutting the EN*
}
if (kata[i].EndsWith("ment"))
{
int panjang = kata[i].Length;
int sisa = panjang - 4;
kata[i] = kata[i].Substring(0, sisa);
//cutting the *Ment
}
if(kata[i].EndsWith("ous"))
{
int panjang = kata[i].Length;
int sisa = panjang - 3;
kata[i] = kata[i].Substring(0, sisa);
//cutting the ous, tremendous, hazardous
}
if (kata[i].EndsWith("ied"))
{
int panjang = kata[i].Length;
int sisa = panjang -1;
kata[i] = kata[i].Substring(0, sisa);
//cutting ied
}
if (kata[i].EndsWith("ly"))
{
int panjang = kata[i].Length;
int sisa = panjang - 2;
kata[i] = kata[i].Substring(0, sisa);
//cutting fluently, diligently
}
sw.Write(kata[i] + " ");
}
sw.Flush();
sw.Close();
MessageBox.Show("Converted and Saved ", "KTM Stemming", MessageBoxButtons.OK, MessageBoxIcon.Information);
}